原题链接:https://vjudge.net/problem/UVA-10118
分类:记忆化搜索
备注:状态分析
#include <bits/stdc++.h>
using namespace std;
int n, pile[4][45], pos[4], dp[45][45][45][45], hav[25];
int dfs(int cap) {
// printf("%d %d %d %d, cap = %d\n", pos[0], pos[1], pos[2], pos[3], cap);
if (dp[pos[0]][pos[1]][pos[2]][pos[3]] || cap <= 0) return dp[pos[0]][pos[1]][pos[2]][pos[3]];
int ans = 0;
for (int i = 0; i < 4; i++) {
if (pos[i] == n) continue;
pos[i]++;
int x = pile[i][pos[i]];
hav[x]++;
if (hav[x] % 2 == 0)
ans = max(ans, dfs(cap + 1) + 1);
else
ans = max(ans, dfs(cap - 1));
hav[x]--;
pos[i]--;
}
return dp[pos[0]][pos[1]][pos[2]][pos[3]] = ans;
}
int main(void) {
// freopen("in.txt", "r", stdin);
while (~scanf("%d", &n) && n) {
pos[0] = pos[1] = pos[2] = pos[3] = 0;
for (int j = 1; j <= n; j++)
for (int i = 0; i < 4; i++)
scanf("%d", &pile[i][j]);
memset(dp, 0, sizeof(dp));
printf("%d\n", dfs(5));
}
return 0;
}