uva 10118 - Free Candies-动态规划

//
//  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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值