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"); }}
- HDU 4272
- hdu 4272
- HDU 4272 LianLianKan(贪心!!!!!)
- hdu 4272 LianLianKan
- hdu 4272 LianLianKan
- HDU 4272 lianliankan
- HDU 4272 LianLianKan
- hdu
- hdu
- HDU
- hdu ()
- hdu
- hdu
- HDU
- HDU
- hdu
- hdu
- HDU
- jquery手机号验证
- ubuntu下手动安装jre全过程
- 解决VC++6.0不能打开文件和添加文件的问题
- ADF11g-013:ADF笔记
- linux indent格式化代码
- HDU 4272
- php 评论 间隔时间限制 原理
- Android 水波效果原理与实现
- 电影记录管理系统2[增删改查]
- 通过url打开app的方法
- position:fixed
- javascript设置cookie值
- C#操作MySql,PostgreSQL
- 心得15--网络编程6-图片等二进制文件的上传与输出