UVa 10118 - Free Candies(记忆化搜索)

来源:互联网 发布:淘宝搜索词查询在哪里 编辑:程序博客网 时间:2024/05/20 22:30

给出4堆糖,往容量为5篮子里装任意一个在堆顶的糖,篮子里有相同颜色的就拿走,问最多能拿走几次。

定义四维数组记忆搜索。

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=45;bool bas[25];int n,piles[4][maxn],k[maxn][maxn][maxn][maxn];int dp(int a,int b,int c,int d){    int& best=k[a][b][c][d];    if(best!=-1) return best;    if(count(bas,bas+25,true)==5) return best=0;    if(a==n&&b==n&&c==n&&d==n) return best=0;    if(a!=n){        bool& p=bas[piles[0][a]];        p=!p;        best=max(best,dp(a+1,b,c,d)+(p?0:1));        p=!p;    }    if(b!=n){        bool& p=bas[piles[1][b]];        p=!p;        best=max(best,dp(a,b+1,c,d)+(p?0:1));        p=!p;    }    if(c!=n){        bool& p=bas[piles[2][c]];        p=!p;        best=max(best,dp(a,b,c+1,d)+(p?0:1));        p=!p;    }    if(d!=n){        bool& p=bas[piles[3][d]];        p=!p;        best=max(best,dp(a,b,c,d+1)+(p?0:1));        p=!p;    }    return best;}int main(){    while(scanf("%d",&n),n){        memset(k,-1,sizeof(k));        memset(bas,0,sizeof(bas));        memset(piles,0,sizeof(piles));        for(int i=0;i<n;++i)            for(int j=0;j<4;++j)                scanf("%d",&piles[j][i]);        printf("%d\n",dp(0,0,0,0));    }    return 0;}


0 0
原创粉丝点击