YunYan

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1059

题目大意:有四堆糖果,称矩阵排列,一共有n行,只能在每一堆的最上方取糖果,病放入篮子中,如果篮子中有相同的颜色的糖果则可以抵消,篮子中最多能盛放5个糖果,当篮子中的

糖果数量达到5个时,游戏结束。问最多能获得多少个糖果。

解法:由于每次都只能从每一堆的最上方取糖果,所以先开一个一维数组 用来记录每一堆取到了第几行,再开一个bool数组,用来判断该颜色的糖果有没有出现过。再开一个四维的数组用来记录该状态的最大能取回多少糖果。

#include<iostream>
#include<cstring>
using namespace std;
int n;
int arr[50][6];
bool pre[6];
int dp[50][50][50][50];
int toal[5];

int dfs(int x){
    
    if(dp[toal[1]][toal[2]][toal[3]][toal[4]]!=-1){
        return dp[toal[1]][toal[2]][toal[3]][toal[4]];
    }
    if(x==5) return 0; 
    int ans=0;
    for(int i=1;i<=4;i++){
        if(toal[i]==n+1) continue ;
        int color=arr[toal[i]][i];
        if(pre[color]){
            pre[color]=0;
            toal[i]++;
            ans=max(ans,dfs(x-1)+1);//加一
            toal[i]--;//回溯
            pre[color]=1;//回溯
       
        }
        else {
            pre[color]=1;
            toal[i]++;
            ans=max(ans,dfs(x+1));//如果没有相同颜色的糖果,则不用加1
            toal[i]--;
            pre[color]=0;
        }
    }
//    cout<<ans<<endl;
    return dp[toal[1]][toal[2]][toal[3]][toal[4]]=ans;
}


int main(){
    cin>>n;
    for(int i = 1;i<=n;i++)
        for(int j=1;j<=4;j++){
            cin>>arr[i][j];
        }
    memset(dp,-1,sizeof(dp));
    memset(pre,0,sizeof(pre));
    for(int i=1;i<=4;i++){
        toal[i]=1;
    }
    
    cout<<dfs(0)<<endl; 
    return 0;
} 

总结:再写dfs的时候,如果定义为int类型,一定要先清楚,,返回值的意义。

 

posted on 2019-08-02 17:23  Target--fly  阅读(100)  评论(0编辑  收藏  举报