#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;
}ZOJ 1227 Free Candies(记忆化搜索)
最新推荐文章于 2026-06-01 22:48:44 发布
本文展示了一个结合递归搜索和动态规划解决特定问题的C++实现案例。通过对状态进行预计算并缓存结果,避免了重复计算,提高了搜索效率。文章通过一个具体的递归函数实现了解决方案,并详细展示了如何更新状态以及递归调用的过程。


541

被折叠的 条评论
为什么被折叠?



