(1331)HDU-记忆化搜索

#include<iostream>
#include<cstdio>
#include<string.h>
#include<string>
#include<set>
#include<algorithm>
#include<cmath>


#define ll __int64
#define MAX 1000009
using namespace std;


/*

记忆化搜索

计算过的就存起来,不用多次递归

*/
int dp[109][109][109];


int w(int a,int b,int c)
{
    if(dp[a][b][c]) return dp[a][b][c];
    else
    {
        if(a<=0||b<=0||c<=0)
            return 1;
        else if(a<b&&b<c)
            return dp[a][b][c] = w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c);
        else
            return 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) ;
    }
}
int main()
{
    int a,b,c;
    while(~scanf("%d%d%d",&a,&b,&c))
    {
        memset(dp,0,sizeof(dp));
        if(a==-1&&b==-1&&c==-1)break;
        if(a<=0||b<=0||c<=0)
            printf("w(%d, %d, %d) = %d\n",a,b,c,1);
        else if(a>20||b>20||c>20)
            printf("w(%d, %d, %d) = %d\n",a,b,c,w(20,20,20));
        else
            printf("w(%d, %d, %d) = %d\n",a,b,c,w(a,b,c));
    }
    return 0;
}

你可能感兴趣的:((1331)HDU-记忆化搜索)