题目:http://acm.hdu.edu.cn/showproblem.php?pid=1165
果断不擅长找规律啊,做这种题静不下心来。
Ackermann function can be defined recursively as follows:
递推如上图,
0<m<=3,0<=n<=1000000,,当m==3时,n>=0&&n<=24.
首先发现a(0,i)=i+1;
另外n==0时,a(1,0)=a(0,1)=2;
当m==1,n>0时,a(1,n)=a(0,a(1,n-1)=a(1,n-1)+1;
有上式找到当m==1时的递推公式,a(1,i)=a(1,i-1)+1;(其中a(1,0)=2);
所以a(1,i)=i+2;
同理,当m==2,n>0时,a(2,n)=a(1,a(2,n-1))=a(2,n-1)+2;(其中a(2,0)=a(1,1)=3)
所以a(2,i)=2*i+3;
所以a(3,i)=a(2,a(3,i-1))=2*a(3,i-1))+3;
由此可以解出结果。
代码如下:
#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #define inf 0x3f3f3f3f using namespace std; int dp[4][1000010],n,m; int main() { for(int i=0;i<=1000000;i++) dp[0][i]=i+1; dp[1][0]=2; for(int i=1;i<=1000000;i++) dp[1][i]=i+2; dp[2][0]=3; for(int i=1;i<=1000000;i++) { dp[2][i]=dp[2][i-1]+2;//2*i+3 } dp[3][0]=5; for(int i=1;i<=24;i++) { dp[3][i]=2*(dp[3][i-1])+3; } while(scanf("%d%d",&n,&m)!=EOF) { printf("%d ",dp[n][m]); } return 0; }