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

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

记忆化递归代码:

#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;
	  }
} 

你可能感兴趣的:(hdu 1331||1579 Function Run Fun(记忆化))