我有话说:
这道题比较简单,总思路就是dfs+记忆化搜索
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
const int maxn=100;
int n;
int candy[4][maxn],vis[maxn],top[4];
int dp[maxn][maxn][maxn][maxn];
int dfs(int cnt)
{
int& ans=dp[top[0]][top[1]][top[2]][top[3]];
if(ans!=-1)return ans;
if(cnt==5)return ans=0;
ans=0;
for(int i=0;i<4;i++){
if(top[i]==n)continue;
int color=candy[i][top[i]];
top[i]++;
if(vis[color]){
vis[color]=0;
ans=max(ans,dfs(cnt-1)+1);
vis[color]=1;
}else{
vis[color]=1;
ans=max(ans,dfs(cnt+1));
vis[color]=0;
}
top[i]--;
}
return ans;
}
int main()
{
while(scanf("%d",&n)==1&&n){
for(int i=0;i<n;i++){
for(int j=0;j<4;j++){
scanf("%d",&candy[j][i]);
}
}
memset(top,0,sizeof(top));
memset(dp,-1,sizeof(dp));
memset(vis,0,sizeof(vis));
printf("%d\n",dfs(0));
}
return 0;
}