题目:统计递归函数调用的次数。
分析:动态规划(DP)。
状态定义:f(n,back)为对应输入的调用次数;
转移方程:f(n,back)= 1+sum(f(n-1,back),f(n-2,back),...,f(n-back,back));
初始状态:f(0,x)= 1,f(1,x)= 1;
注意每个状态都要+1代表自己,f(0,x)的时候不是0是1;
说明:输入中有n和back小于0的,按照题目里的%I64u输出一直WA,改成%llu就过了。。。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
unsigned long long F[66][66];
int main()
{
for (int i = 0; i < 61; ++ i) {
for (int j = 0; j < 61; ++ j) {
F[i][j] = 1ULL;
}
}
for (int i = 2; i < 61; ++ i) {
for (int j = 1; j < 61; ++ j) {
F[i][j] = 1ULL;
for (int k = 1; k <= j; ++ k) {
if (i-k <= 1) {
F[i][j] += 1ULL;
}else if (i-k > 1) {
F[i][j] += F[i-k][j];
}
}
}
}
int n, back, cases = 1;
while (~scanf("%d%d",&n,&back) && n < 61) {
if (n >= 0 && back >= 0) {
printf("Case %d: %llu\n",cases ++,F[n][back]); // %llu ?
}else {
printf("Case %d: 1\n",cases ++);
}
}
return 0;
}