UVA 10118 dfs

来源:互联网 发布:mac安装win10格式化 编辑:程序博客网 时间:2024/06/04 00:54
/*有四堆糖果 每堆糖果都是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));    }}

0 0
原创粉丝点击