UVa 10118 - Free Candies(记忆化搜索)
2015-03-09 17:08
459 查看
给出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; }
相关文章推荐
- UVA 10118 Free Candies 记忆化搜索 dp紫书9-2
- UVA-10118 Free Candies (DP、记忆化搜索)
- UVA - 10118 Free Candies 记忆化搜索
- UVA 10118 - Free Candies(记忆化搜索)
- 100道动态规划——5 UVA 10118 Free Candies 记忆化搜索 以及 证明状态
- UVa 10118 Free Candies(记忆化搜索经典)
- uva 10118 - Free Candies(记忆化搜索)
- UVA - 10118 Free Candies(dfs+记忆化搜索)
- UVa 10118 Free Candies (记忆化搜索+状态压缩)
- UVa 10118 记忆化搜索 Free Candies
- UVa 10118 Free Candies(记忆化搜索经典)
- UVA 10118 Free Candies(记忆化搜索)
- uva 10118 (Free Candies)(DP)
- UVa #10118 Free Candies (习题9-2)
- uva 10118 ——Free Candies
- 记忆化搜索 逆向dp uva10118
- uva 10118 Free Candies
- uva 10118 Free Candies
- uva 10118 - Free Candies
- UVa 10118 Free Candies 记忆化搜索