求(n,bcak)递归次数。自己推出来了一个式子:
其实就是这个式子,但是不知道该怎么写,怕递归写法超时。其实直接递推就好,边界条件易得C(0,back)=1、C(1,back)=1。
Reference Code:
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 typedef unsigned long long ll; 5 ll dp[61][61]={0}; 6 7 int main() 8 { 9 int n,back; 10 for(int i=0;i<=1;i++) 11 for (int j=0;j<=60;j++) 12 dp[i][j]=1; 13 for(int i=2;i<=61;i++) 14 for (int j=0;j<=60;j++){ 15 ll sum=0; 16 for(int k=1;k<=j;k++) 17 if(i-k<0) sum+=1; 18 else sum+=dp[i-k][j]; 19 dp[i][j]=sum+1; 20 } 21 int cas=1; 22 while(scanf("%d%d",&n,&back)==2) 23 { 24 if(n>60) break; 25 if(n<0) n=0; 26 cout<<"Case "<<cas++<<": "<<dp[n][back]<<endl; 27 } 28 return 0; 29 }
Reference Blog:http://knightzone.org/?p=1408
时间: 2024-10-03 23:04:15