zoukankan      html  css  js  c++  java
  • D

    题目链接: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类型,一定要先清楚,,返回值的意义。

  • 相关阅读:
    智能汽车无人驾驶资料调研(一)
    Python 学习
    关于中英文排版的学习
    UI Testing
    项目管理:第一次参与项目管理
    自动化测试用什么语言好
    什么是自动化测试
    睡眠的重要性
    python的pip和cmd常用命令
    矩阵的切片计算(截取)
  • 原文地址:https://www.cnblogs.com/Accepting/p/11289987.html
Copyright © 2011-2022 走看看