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