您的位置:首页 > 其它

ZOJ 1227 Free Candies(记忆化搜索)

2013-04-25 06:41 253 查看
#include <iostream>
#include <cstdio>
#include <memory.h>
#include <vector>
using namespace std;
const int maxn=21;

int cnt[maxn],grid[maxn*2][4],mxans,n,idx[4],ans;;
bool dp[42][42][42][42];

void dfs(int tms){
mxans=max(mxans,ans);
bool &ref=dp[idx[0]][idx[1]][idx[2]][idx[3]];
if(tms>=5)return;
else if(ref)return;
ref=1;
for (int i=0;i<4;++i){
if(idx[i]<n){
int f=0;
if(cnt[grid[idx[i]][i]]+1==2){
cnt[grid[idx[i]][i]]=0;
tms--;
f=1;
ans++;
}else{
cnt[grid[idx[i]][i]]=1;
tms++;
}
idx[i]++;
dfs(tms);
idx[i]--;
if(f){
cnt[grid[idx[i]][i]]=1;
tms++;
ans--;
}else{
cnt[grid[idx[i]][i]]=0;
tms--;
}

}
}

}
int main(){
while (scanf("%d",&n)&&n){
memset(grid,0,sizeof(grid));
for (int i=0;i<n;++i){
for (int j=0;j<4;++j){
int t;
scanf("%d",&grid[i][j]);
}
}
mxans=0;
ans=0;
memset(dp,0,sizeof(dp));
memset(cnt,0,sizeof(cnt));
memset(idx,0,sizeof(idx));
dfs(0);
printf("%d\n",mxans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: