hdu 1331||1579 Function Run Fun(记忆化)

来源:互联网 发布:剑灵力士女捏脸数据图 编辑:程序博客网 时间:2024/05/19 06:38

          我开始写了个循环求解的,但是错的, 然后我又改了下, 还是不对; 但是我感觉这个和背包问题差别不大, 应该能用循环球出的吧……如果哪位同学知道,请指点一下……

记忆化递归代码:

#include<iostream>using namespace std;int w[21][21][21];int DP(int i, int j, int k){if( i<=0 || j<=0 || k<=0) return 1;if( i>20 || j>20 || k>20) return DP(20,20,20);//关键:这是记忆化的关键,如果去掉,和纯递归一样的if( w[i][j][k]!=-1) return w[i][j][k]; else {     if( i<j && j<k)  w[i][j][k]=DP(i,j,k-1)+DP(i,j-1, k-1)-DP(i,j-1, k);     else   w[i][j][k]=DP(i-1,j, k)+DP(i-1,j-1, k)+DP(i-1,j,k-1)-DP(i-1,j-1,k-1);}return w[i][j][k];}int main(){int a, b, c;   memset(w, -1, sizeof(w));    while( cin>>a>>b>>c && !(a==-1 && b==-1 && c==-1))     {       cout<<"w("<<a<<", "<<b<<", "<<c<<") = "<<DP(a, b, c)<<endl;    }} 


贴上我错误的循环代码……

#include<iostream>using namespace std;int w[21][21][21];int main(){int a, b, c;int i, j, k, ans;w[0][0][0]=1;w[0][0][1]=w[0][1][0]=w[1][0][0]=1;w[0][1][1]=w[1][0][1]=w[1][1][0]=1;for(i=1; i<=20; i++)   for(j=1; j<=20; j++)      for(k=1; k<=20; k++)      {       if( i<j && j<k)            w[i][j][k]=w[i][j][k-1]+w[i][j-1][k-1]-w[i][j-1][k];       else           w[i][j][k]=w[i-1][j][k]+w[i-1][j-1][k]+w[i-1][j][k-1]-w[i-1][j-1][k-1];        }      while( cin>>a>>b>>c && !(a==-1 && b==-1 && c==-1))   {        if( a<=0 || b<=0 || c<=0) ans=1;      else if(a>20 || b>20 || c>20)ans=w[20][20][20];     else ans=w[a][b][c];     cout<<"w("<<a<<", "<<b<<", "<<c<<") = "<<ans<<endl;  }}