博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj3254二进制放牛——状态压缩DP
阅读量:4969 次
发布时间:2019-06-12

本文共 1088 字,大约阅读时间需要 3 分钟。

题目:

利用二进制压缩状态,每一个整数代表一行的01情况;

注意预处理出二进制表示下没有两个1相邻的数的方法,我的方法(不知为何)错了,看到了别人的优美方法;

再进行DP即可。

代码如下:

#include
#include
using namespace std;int m,n,a[15],num[15],p[3005],f[15][3005],tot,INF=100000000,ans;//int pw(int w)//{// int ret=1;// int sum=1;// while(w)// {// ret*=2;// if(w&1)sum*=ret;// w/=2;// }// return sum;//}//void ap(int w,int b,int jl)//2^w b=0/1 +jl//{// if(w==n-1)// {// if(!b)p[++tot]=jl;// else// {// p[++tot]=jl;// p[++tot]=jl+pw(w);// }// return;// }// if(!b)ap(w+1,1,jl);// else// {// ap(w+1,0,jl+pw(w));// ap(w+1,1,jl);// }//}inline bool ok(int x){ //判断状态x是否可行 if(x&x<<1) return false;//若存在相邻两个格子都为1,则该状态不可行 return true; } void init(){ //遍历所有可能的状态 int total = 1 << n; //遍历状态的上界 for(int i = 0; i < total; ++i){ if(ok(i))p[++tot] = i; } } int main(){ scanf("%d%d",&m,&n); for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) { scanf("%d",&a[j]); num[i]*=2; num[i]+=a[j]; } init();// ap(0,1,0);// cout<
<

  

转载于:https://www.cnblogs.com/Zinn/p/8460622.html

你可能感兴趣的文章
POJ 1308 Is It A Tree?(并查集)
查看>>
N进制到M进制的转换问题
查看>>
利用sed把一行的文本文件改成每句一行
查看>>
Android应用开发:核心技术解析与最佳实践pdf
查看>>
python——爬虫
查看>>
孤荷凌寒自学python第五十八天成功使用python来连接上远端MongoDb数据库
查看>>
求一个字符串中最长回文子串的长度(承接上一个题目)
查看>>
简单权限管理系统原理浅析
查看>>
springIOC第一个课堂案例的实现
查看>>
求输入成绩的平均分
查看>>
php PDO (转载)
查看>>
wordpress自动截取文章摘要代码
查看>>
[置顶] 一名优秀的程序设计师是如何管理知识的?
查看>>
scanf和gets
查看>>
highcharts 图表实例
查看>>
ubuntu下如何查看用户登录及系统授权相关信息
查看>>
秋季学期学习总结
查看>>
SpringBoot 优化内嵌的Tomcat
查看>>
【LaTeX】E喵的LaTeX新手入门教程(1)准备篇
查看>>
highcharts曲线图
查看>>