/*有四堆糖果 每堆糖果都是n个 并且糖果用一个<=20的数来表示,问一个人拿着一个篮子 篮子的容量是5 一旦拿的这个和篮子里的相等,就把篮子里的这个拿出来 要不然就把拿的这个放进篮子里 问最大你能拿到多少对*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<vector>
using namespace std;
typedef long long ll;
typedef pair<int,int> pp;
#define inf 0x3f3f3f3f
#define eps 1e-10
#define maxl 100010
#define mem(i,j) memset(i,j,sizeof(i))
const int mod=1e9+7;
const double pi=acos(-1);
int d[44][44][44][44];//表示的就是每个篮子里面还有多少个时候的最大对数 所以初始状态为d[0][0][0][0]
int a[44][44];
int vis[24];
int n;
int dfs(int step,int num[]){
int &ans=d[num[0]][num[1]][num[2]][num[3]];//前面记忆化剪枝
if(ans>=0) return ans;
if(step>=5) return 0;
ans=0;
for(int i=0;i<4;i++){
int l[4];
for(int j=0;j<4;j++) l[j]=num[j];//用来改变状态
l[i]++;
if(l[i]>n) continue;
if(vis[a[l[i]][i]]){ //判断成对的话只要标记就好了 注意标记的改变
vis[a[l[i]][i]]=0;
ans=max(ans,dfs(step-1,l)+1);
vis[a[l[i]][i]]=1;//这里改回来只是为了下一次用的时候不用再初始化
}
else{
vis[a[l[i]][i]]=1;
ans=max(ans,dfs(step+1,l));
vis[a[l[i]][i]]=0;
}
}
return ans;
}
int main()
{
freopen("in.txt", "r", stdin);
while(cin>>n&&n){
memset(d,-1,sizeof(d));
// memset(vis,0,sizeof(vis));
for(int j=1;j<=n;j++)//注意这里的输入
for(int i=0;i<4;i++)
cin>>a[j][i];
int c[4]={0};
printf("%d\n",dfs(0,c));
}
}
UVA 10118 dfs
最新推荐文章于 2018-11-21 18:09:17 发布