https://cn.vjudge.net/problem/UVA-10118
#include <iostream>
#include <cmath>
#include <cstring>
#define ll long long
using namespace std;
int dp[45][45][45][45];
int top[5];
int n;
int a[5][45];
int dfs(ll lan,int num)
{
if(dp[top[1]][top[2]][top[3]][top[4]]!=-1) return dp[top[1]][top[2]][top[3]][top[4]];
int Max=0;
int sum=0;
for(int i=1;i<=4;i++)
{
top[i]++;
if(top[i]<=n)
{
if(lan&(1LL<<(a[i][top[i]])))
{
sum=dfs(lan^(1LL<<a[i][top[i]]),num-1)+1;
}
else if(num<4)
{
sum=dfs(lan|(1LL<<a[i][top[i]]),num+1);
}
}
Max=max(Max,sum);
top[i]--;
}
dp[top[1]][top[2]][top[3]][top[4]]=Max;
return Max;
}
int main()
{
while(cin>>n&&n)
{
memset(dp,-1,sizeof(dp));
memset(top,0,sizeof(top));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=4;j++)
{
cin>>a[j][i];
}
}
cout<<dfs(0,0)<<endl;
}
return 0;
}