uva 10118 - Free Candies-动态规划

来源:互联网 发布:海岛奇兵火炮能量数据 编辑:程序博客网 时间:2024/05/14 22:52
////  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 longusing 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;}

0 0