HDU 4272

来源:互联网 发布:怎样参加淘宝天天特价 编辑:程序博客网 时间:2024/06/06 15:52

正解是状态压缩的搜索

dfs求是否有可行解,bfs求最优解

#include<cstdio>#include<cstring>#include<queue>#include<map>using namespace std;int n;int num[2000],num1[2000];int dp[1100][1100];int dfs(int pos,int sta){    int npos,nsta,i,j,cou;    if(pos==n+1)return 1;    if(dp[pos][sta]!=-1)return dp[pos][sta];    int k=1;    for(i=1;i<10 && i+pos<=n && k<=5;i++){        if(((1<<i)&sta)==0)continue;        k++;        if(num[pos]==num[i+pos]){            for(j=1;j<10 && j+pos<=n;j++)                if(j!=i && ((1<<j)&sta))break;            if(j+pos==n+1 || j==10){                npos=pos+j;                nsta=(1<<10)-1;                dp[npos][nsta]=dfs(npos,nsta);                if(dp[npos][nsta]==1)                    return 1;            }            else{                npos=pos+j;                nsta=sta>>j;                if(j<i)                    nsta-=(1<<(i-j));                for(cou=10-j;cou<10;cou++)                    nsta+=1<<cou;                dp[npos][nsta]=dfs(npos,nsta);                if(dp[npos][nsta]==1)                    return 1;            }        }    }    dp[pos][sta]=0;    return 0;}int main(){    int i;    map<int,int>mp;    while(scanf("%d",&n)==1){        mp.clear();        for(i=1;i<=n;i++){            scanf("%d",&num1[i]);            if(mp.find(num1[i])!=mp.end())                mp[num1[i]]++;            else                mp[num1[i]]=1;        }        for(i=1;i<=n;i++)            num[i]=num1[n-i+1];        int flag=1;        for(map<int,int>::iterator it=mp.begin();it!=mp.end();it++){            if((it->second)%2){                flag=0;                break;            }        }        if(flag==0){            printf("0\n");            continue;        }        memset(dp,-1,sizeof(dp));        if(dfs(1,1023))            printf("1\n");        else            printf("0\n");    }}



原创粉丝点击