NOIP2017练习函数变换(DP,dfs)

Posted myx12345

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NOIP2017练习函数变换(DP,dfs)相关的知识,希望对你有一定的参考价值。

题意:

思路:

极限步数大概不会超过30

 1 const max=100000;
 2 var dp:array[1..max,0..2]of longint;
 3     eul:array[1..max]of longint;
 4     cas,v,n,k,i,ans,j:longint;
 5 
 6 function min(x,y:longint):longint;
 7 begin
 8  if x<y then exit(x);
 9  exit(y);
10 end;
11 
12 function euler(x:longint):longint;
13 var tmp,i:longint;
14 begin
15  if x<=max then exit(eul[x]);
16  euler:=x; tmp:=trunc(sqrt(x));
17  for i:=2 to tmp do
18   if x mod i=0 then
19   begin
20    while x mod i=0 do x:=x div i;
21    euler:=euler div i*(i-1);
22   end;
23  if x>1 then euler:=euler div x*(x-1);
24 end;
25 
26 function clac(n,k:longint):longint;
27 begin
28  if n<=max then exit(dp[n,k]);
29  clac:=clac(euler(n),k)+1;
30  if k>0 then clac:=min(clac,clac((n>>1)+1,k-1)+1);
31 end;
32 
33 begin
34  assign(input,\'func.in\'); reset(input);
35  assign(output,\'func.out\'); rewrite(output);
36  readln(cas);
37  for i:=1 to max do eul[i]:=i;
38  for i:=2 to max do
39  begin
40   if eul[i]=i then
41    for j:=1 to max div i do eul[i*j]:=eul[i*j] div i*(i-1);
42   dp[i,0]:=dp[eul[i],0]+1;
43   dp[i,1]:=min(dp[eul[i],1],dp[(i>>1)+1,0])+1;
44   dp[i,2]:=min(dp[eul[i],2],dp[(i>>1)+1,1])+1;
45  end;
46 
47  for v:=1 to cas do
48  begin
49   readln(n,k);
50   ans:=clac(n,0);
51   if k>0 then ans:=min(ans,clac(n,1));
52   if k>1 then ans:=min(ans,clac(n,2));
53   writeln(ans);
54  end;
55  close(input);
56  close(output);
57 end.

 

以上是关于NOIP2017练习函数变换(DP,dfs)的主要内容,如果未能解决你的问题,请参考以下文章

2017 9 21

树形dp(数字转换NOIP17提高模拟训练4)

牛客练习赛1 树 dp + dfs序

DFS+记忆化剪枝--[NOIP2017 普及组] 棋盘

dp练习——最大乘积

NOIP 考前 图论练习