当前位置:编程学习 > C/C++ >>

HDU 4272

正解是状态压缩的搜索

dfs求是否有可行解,bfs求最优解
[cpp
#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"); 
    } 

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,