蒟蒻的自我拯救。。。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
int n,dp[50][50][50][50];
int save[50][5],x[10];
int dfs(int bas,int num)
{
if(dp[x[1]][x[2]][x[3]][x[4]]!=-1)
return dp[x[1]][x[2]][x[3]][x[4]];
int maxn=0,sum=0,kind;
for(int i=1;i<=4;i++)
{
x[i]++;
if(x[i]<=n)
{
kind=(1<<save[x[i]][i]);
if(bas&kind)
{
int tt=bas^kind;
sum=dfs(tt,num-1)+1;
}
else if(num<4)
{
sum=dfs(bas|(kind),num+1);
}
}
maxn=max(maxn,sum);
x[i]--;
}
return dp[x[1]][x[2]][x[3]][x[4]]=maxn;
}
int main()
{
while(scanf("%d",&n))
{
if(n==0)
break;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=4;j++)
scanf("%d",&save[i][j]);
}
for(int i=1;i<=4;i++)
{
x[i]=0;
}
memset(dp,-1,sizeof(dp));
printf("%d\n",dfs(0,0));
}
return 0;
}