poj 1579 Function Run Fun (记忆化搜索)

一直以为这道题是剪枝,没想到记忆化搜索会使时间变得这么短

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

int a,b,c;

int quick_pow(int a,int b)
{
    int s=1;
    while(b>0)
    {
        if(b%2==1) s*=a;
        a=a*a;
        b=b>>1;
    }
    return s;
}

int dp[20][20][20];

int DFS(int a,int b,int c)
{
    if(a<=0||b<=0||c<=0) return 1;
    if(a>20||b>20||c>20) return DFS(20,20,20);

    if(dp[a][b][c]) return dp[a][b][c];
    if(a==b&&b==c)  dp[a][b][c]=quick_pow(2,a);//这是之前剪枝的部分可删去


    if(a<b&&b<c) dp[a][b][c]=DFS(a,b,c-1)+DFS(a,b-1,c-1)-DFS(a,b-1,c);
    else dp[a][b][c]=DFS(a-1,b,c)+DFS(a-1,b-1,c)+DFS(a-1,b,c-1)-DFS(a-1,b-1,c-1);
    return dp[a][b][c];
}

int main()
{
    while(cin>>a>>b>>c&&(a!=-1||b!=-1||c!=-1))
    {
        memset(dp,0,sizeof(dp));
        DFS(a,b,c);
        printf("w(%d, %d, %d) = %d\n",a,b,c,DFS(a,b,c));
    }


    return 0;
}

猜你喜欢

转载自www.cnblogs.com/Fy1999/p/9061111.html