您的位置:首页 > 其它

uva 10118 - Free Candies-动态规划

2015-10-07 23:22 483 查看
//
//  main.cpp
//  uva 10118 - Free Candies-动态规划
/*
这一题是多阶段决策问题.另外注意的就是状态压缩。即使用二进制表示当前的pocket具有的糖果的颜色。
在每一步选择哪一个管道决定了下一步。
我们设d[i][j][k][l] 表示依次从第一,第二个管道,第三个管道,第四个管道,当前已经到达的位置,剩下可以获得的candies对数。
这里ans 表示d[i][j][k][l].
则若选择从第一个管道取一个    ans = max(ans ,d[i+1][j][k][l]  +add ) .add表示从第一个管道选择一个candy的话,是否使得pocket具有相同的颜色的candy.
*/
#include <iostream>
#include <queue>
#include <stack>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <cstdio>
#define ll long long
using namespace std ;
int pile[4][50] ;
int  n ;

int d[45][45][45][45] ;

int dp(int  i , int j , int k , int l ,int  poc)
{
int& ans =d[i][j][k][l];
if (ans>=0) {
return ans ;
}
else{
int num = 0,t,add ;
for(int i = 0 ; i < 20 ; i++)
{
if(poc&(1 << i )) num++ ;
}

if(num ==5)
{
ans = 0 ;
return  0 ;
}
else{
ans = 0;
}
if(i <n ) {
t = poc^(1<<(pile[0][i+1]-1)) ;
add = poc > t ? 1:0 ;
ans = max(ans ,dp(i+1, j, k, l,t) + add) ;
}
if(j < n ) {
t = poc^(1<<(pile[1][j+1]-1)) ;
add = poc > t ? 1:0 ;
ans = max(ans ,dp(i, j+1, k, l,t) + add) ;
}if(k <n ) {
t = poc^(1<<(pile[2][k+1]-1)) ;
add = poc > t ? 1:0 ;
ans = max(ans ,dp(i, j, k+1, l,t) + add) ;
}if(l <n ) {
t = poc^(1<<(pile[3][l+1]-1)) ;
add = poc > t ? 1:0 ;
ans = max(ans ,dp(i, j, k, l+1,t) + add) ;
}
return ans;
}
}

int main(int argc, const char * argv[]) {
while (scanf("%d" ,&n) , n ) {
for (int i = 1; i <= n ; i++) {
scanf("%d%d%d%d" ,&pile[0][i] ,&pile[1][i] ,&pile[2][i] ,&pile[3][i]) ;
}
memset(d, -1, sizeof(d)) ;
cout<<dp(0, 0, 0, 0, 0)<<endl ;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息