标签:
这两题是一模一样的```
题意:给了一系列递推关系,但是由于这些递推很复杂,所以递推起来要花费很长的时间,所以我要编程序在有限的时间内输出答案。
w(a, b, c):
如果a,b,c中有一个值小于等于0,那么w(a, b, c)的值为1
如果a,b,c中有一个值大于20,那么w(a, b, c)的值为w(20, 20, 20)
如果a<b<c,那么w(a, b, c)=w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c)
否则w(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)
我尝试过,就按这个输入进去,然后a=15,b=15,c=15,基本上是等不到头的,不断的递推会花上几个小时,所以我的第一想法是:找规律!!!是的我就是这么蠢没有办法。
我找了很久很久的规律,然后通过打表的方法几乎找出了一半的规律,我满心欢喜得用这些规律替代了部分的递推让答案很容易被求出,然后我尝试了一下我尝试的值也都非常快得输出了,于是我就作死提交了,T了。我```我竟无言以对啊,我以为是我找的规律不够深刻,然后```总之并找不出规律的我终于放弃了,粗看题解:记忆化搜索。
再见吧朋友我根本思路就完全错了嘛```知道真相的我作死地在我找的规律上面修改出记忆化,提交之后```WA了```
我想起了一句话:不要沮丧,矮不是你的错,抬起头来告诉大家,你不仅矮,你还丑```
是的,我思路完全是错的,并且,我找的规律也是错的!
好吧,我认了,去掉我那该死的规律之后,我终于A了```就这样吧,代码顺便附上我作死的规律,恩它是错的```
1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 int dp[21][21][21];/* 5 void fun(){ 6 int i,j,k; 7 for(i=0;i<=20;i++){ 8 for(j=0;j<=20;j++){ 9 for(k=0;k<=20;k++){ 10 if(i<=0||j<=0||k<=0)dp[i][j][k]=1; 11 else if(j==1&&k==1)dp[i][j][j]=i+1; 12 else if(j>=i||k>=i)dp[i][j][k]=pow(2,i); 13 } 14 } 15 } 16 }*/ 17 int w(int a,int b,int c){ 18 if(a<=0||b<=0||c<=0)return 1; 19 if(a>20||b>20||c>20)return w(20,20,20); 20 if(dp[a][b][c])return dp[a][b][c]; 21 if(a<b&&b<c){ 22 dp[a][b][c]=w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c); 23 return dp[a][b][c]; 24 } 25 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)); 26 return dp[a][b][c]; 27 } 28 29 int main(){ 30 memset(dp,0,sizeof(dp)); 31 // fun(); 32 int a,b,c; 33 while(scanf("%d%d%d",&a,&b,&c)!=EOF&&(a!=-1||b!=-1||c!=-1)){ 34 printf("w(%d, %d, %d) = ",a,b,c); 35 printf("%d\n",w(a,b,c)); 36 } 37 return 0; 38 }
标签:
原文地址:http://www.cnblogs.com/cenariusxz/p/4304579.html