题目连接:点击打开链接
题目思路:傻逼dp没什么好说的,状态转移的时候写成循环,不要学我QAQ
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cstring>
#include<iostream>
#include<sstream>
#include<cmath>
#include<vector>
#define LL long long
#define INF 0x3f3f3f3f
#define eps 1e-6
using namespace std;
const int maxn = 1e7+6;
int T;
int n;
int dp[45][45][45][45];
int a[45];
int b[45];
int c[45];
int d[45];
int dfs(int nowa,int nowb,int nowc,int nowd,int *arr)
{
if(dp[nowa][nowb][nowc][nowd]!=-1)
return dp[nowa][nowb][nowc][nowd];
dp[nowa][nowb][nowc][nowd] = 0;
int cnt = 0;
int tmp1[5];
int tmp2[5];
int tmp3[5];
int tmp4[5];
for(int i = 0;i<5;i++){
if(arr[i]!=0)
cnt++;
tmp1[i] = tmp2[i] = tmp3[i] = tmp4[i] = arr[i];
}
if(cnt>=5)
return dp[nowa][nowb][nowc][nowd];
if(nowa<n){
int sum;
int falg = 0;
for(int i = 0;i<5;i++){
if(tmp1[i]==a[nowa]){
sum = 1;
falg = 1;
tmp1[i] = 0;
break;
}
}
if(!falg){
sum = 0;
for(int i = 0;i<5;i++){
if(tmp1[i]==0){
tmp1[i] = a[nowa];
break;
}
}
}
dp[nowa][nowb][nowc][nowd] = max(dp[nowa][nowb][nowc][nowd],dfs(nowa+1,nowb,nowc,nowd,tmp1)+sum);
}
if(nowb<n){
int sum;
int falg = 0;
for(int i = 0;i<5;i++){
if(tmp2[i]==b[nowb]){
sum = 1;
falg = 1;
tmp2[i] = 0;
break;
}
}
if(!falg){
sum = 0;
for(int i = 0;i<5;i++){
if(tmp2[i]==0){
tmp2[i] = b[nowb];
break;
}
}
}
dp[nowa][nowb][nowc][nowd] = max(dp[nowa][nowb][nowc][nowd],dfs(nowa,nowb+1,nowc,nowd,tmp2)+sum);
}
if(nowc<n){
int sum;
int falg = 0;
for(int i = 0;i<5;i++){
if(tmp3[i]==c[nowc]){
sum = 1;
falg = 1;
tmp3[i] = 0;
break;
}
}
if(!falg){
sum = 0;
for(int i = 0;i<5;i++){
if(tmp3[i]==0){
tmp3[i] = c[nowc];
break;
}
}
}
dp[nowa][nowb][nowc][nowd] = max(dp[nowa][nowb][nowc][nowd],dfs(nowa,nowb,nowc+1,nowd,tmp3)+sum);
}
if(nowd<n){
int sum;
int falg = 0;
for(int i = 0;i<5;i++){
if(tmp4[i]==d[nowd]){
sum = 1;
falg = 1;
tmp4[i] = 0;
break;
}
}
if(!falg){
sum = 0;
for(int i = 0;i<5;i++){
if(tmp4[i]==0){
tmp4[i] = d[nowd];
break;
}
}
}
dp[nowa][nowb][nowc][nowd] = max(dp[nowa][nowb][nowc][nowd],dfs(nowa,nowb,nowc,nowd+1,tmp4)+sum);
}
//cout<<dp[nowa][nowb][nowc][nowd]<<' '<<nowa<<' '<<nowb<<' '<<nowc<<' '<<nowd<<endl;
return dp[nowa][nowb][nowc][nowd];
}
int main()
{
while(~scanf("%d",&n))
{
if(!n)
return 0;
for(int i = 0;i<n;i++){
scanf("%d%d%d%d",&a[i],&b[i],&c[i],&d[i]);
}
memset(dp,-1,sizeof(dp));
int tmp[5] = {0,0,0,0,0};
dfs(0,0,0,0,tmp);
cout<<dp[0][0][0][0]<<endl;
}
return 0;
}