标签:
#include<stdio.h> int w(int a,int b,int c) { if(a<=0||b<=0||c<=0)return 1; else if(a>20||b>20||c>20)return w(20,20,20); else if(a<b&&b<c)return w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c); else return w(a-1,b,c)+w(a-1,b-1,c)+w(a-1,b,c-1)-w(a-1,b-1,c-1); } int main() { int a,b,c; while(scanf("%d%d%d",&a,&b,&c)!=EOF) { if(a==-1&&b==-1&&c==-1)break; printf("w(%d, %d, %d) = %d\n",a,b,c,w(a,b,c)); } }
运行结果是这样的。
然后我发现在递归的过程中有很多重复的部分,导致超时,所以要用记忆化搜索来解决。
也就是把已经计算出来的结果放在一个数组里保存,下次计算到这里的时候直接读取结果就可以了。
下面是正确代码。
#include<stdio.h> int dp[20+5][20+5][20+5]={0}; int w(int a,int b,int c) { if(a<=0||b<=0||c<=0)return 1; if(dp[a][b][c]!=0)return dp[a][b][c];//直接读取 else if(a<b&&b<c) { dp[a][b][c]=w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c); return dp[a][b][c]; } else { dp[a][b][c]= w(a-1,b,c)+w(a-1,b-1,c)+w(a-1,b,c-1)-w(a-1,b-1,c-1); return dp[a][b][c]; } } int main() { int a,b,c,res; while(scanf("%d%d%d",&a,&b,&c)!=EOF) { if(a==-1&&b==-1&&c==-1)break; if(a<=0||b<=0||c<=0)res=1; else if(a>20||b>20||c>20)res=w(20,20,20); else res=w(a,b,c); printf("w(%d, %d, %d) = %d\n",a,b,c,res); } }
HDU 1331 Function Run Fun(记忆化搜索)
标签:
原文地址:http://www.cnblogs.com/Annetree/p/5525743.html