您的位置:首页 > 其它

UVA10118 - Free Candies

2015-09-01 13:00 323 查看
我有话说:

这道题比较简单,总思路就是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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: