篮子里的状态就是取出的糖果堆得状态
所以用4维数组表示糖果堆得状态就行了
每次两种选择:
选一个糖果和篮子中的消除,或者选一个糖果放到篮子中。
判断是否相同还用到了位运算符
把每个颜色换成二进制数代表 就是一个某位上的二进制1
然后判颜色的时候就好判了
如果&为1,就说明篮子里已经有了
删掉的时候直接减就可以
#include<bits/stdc++.h>
using namespace std;
const int N = 41;
int n;
int dp[N][N][N][N];
int mat[N][4];
int DP(int *top,int st,int k){
int &m=dp[top[0]][top[1]][top[2]][top[3]];
if(m!=-1) return m;
if( top[0]==n &&top[1]==n&&top[2]==n &&top[3]==n||k==5) return m=0;
for(int i=0;i<4;i++)
if(top[i]<n){
int bit=1<<mat[top[i]][i];
top[i]++;
if(bit&st) m = max(m,DP(top,st-bit,k-1)+1);
else if(k<5) m = max(m,DP(top,st+bit,k+1));
top[i]--;
}
return m;
}
int main()
{
while(scanf("%d",&n),n){
memset(dp,-1,sizeof(dp));
for(int i=0;i<n;i++)
for(int j=0;j<4;j++)
scanf("%d",&mat[i][j]);
int top[5]={0};
printf("%d\n",DP(top,0,0));
}
return 0;
}