状态dp POJ 3254 Corn Fields
来源:互联网 发布:南昌大学网络教学平台 编辑:程序博客网 时间:2024/05/16 10:53
这题的思路主要是一行一行的找,而每一行所能取到的情况用i&i<<1来找如果是0的话就成立,之后就是确定所选的情况,有没有点是不能用的,和有没有点是与上一行相连的,之后再把最后一行的所有情况加起来就好;
代码中比较难以理解的地方就是位运算的部分,比如说第一个init()函数,他的作用是找出所有满足1和1是分开放置的情况,就是说二进制表示的话起码得是101010这样,其他的见注释吧。
#include <stdio.h>#include <cstring>int v[1<<12],dp[13][1<<12],l;int n,m,a[13][13];void init(){int i;l=0;for(i=0;i<(1<<12);i++){if((i&(i<<1))==0)//这个运算能找出所有若表示成二进制的形式则1和1之间是不相邻的的数v[l++]=i;}}int judge(int x,int y){int i;for(i=0;i<m;i++)if((1<<i)&v[y]&&!a[x][i])//先是看看该点是不是被选中了,再看该点是不是不能被选中return 0;return 1;}int main(){int i,j,k;init();while(~scanf("%d%d",&n,&m)){memset(dp,0,sizeof(dp));for(i=0;i<n;i++)for(j=0;j<m;j++)scanf("%d",&a[i][j]);for(i=0;i<n;i++){for(j=0;v[j]<(1<<m);j++){if(judge(i,j)){if(i==0)dp[0][j]=1;else{for(k=0;v[k]<(1<<m);k++)if((v[k]&v[j])==0)//和上一行比较看看有没有相连的情况dp[i][j]+=dp[i-1][k];}}}}__int64 ans=0;for(i=0;v[i]<(1<<m);i++)ans=(ans+dp[n-1][i])%100000000;printf("%d\n",ans);}return 0;}
1 0
- poj 3254 Corn Fields(DP-状态DP)
- poj 3254 Corn Fields //状态压缩DP
- POJ 3254 Corn Fields 状态压缩DP
- POJ --3254--Corn Fields--状态DP
- poj 3254 Corn Fields(状态压缩dp)
- POJ 3254 Corn Fields (状态压缩DP)
- poj-3254-Corn Fields-状态压缩DP
- poj 3254 Corn Fields (状态压缩DP)
- POJ 3254 Corn Fields (状态压缩DP)
- POJ 3254 Corn Fields(状态压缩dp)
- POJ 3254 Corn Fields 状态压缩dp
- POJ 3254 Corn Fields 状态压缩DP
- poj 3254 Corn Fields ,状态压缩DP
- poj Corn Fields 3254 状态压缩dp
- poj 3254 Corn Fields (状态压缩DP)
- poj 3254 Corn Fields 状态压缩dp
- poj 3254 Corn Fields 状态压缩DP
- poj 3254 Corn Fields (状态压缩dp)
- OpenCV中对图像进行二维离散傅里叶变换
- 暑期dp46道(28) hdoj 1502 Regular Words dp+高精度额
- struct sockaddr_in等Socket编程相关数据类型定义- -
- 尝试公司内部发表文章
- Python--函数式编程
- 状态dp POJ 3254 Corn Fields
- BigInteger
- RobotArt实现焊接模拟到真机运行
- 图标设置动画
- 人脸识别技术大总结
- WebRoot 与 WEB-INF 相关问题学习整理
- elasticsearch配置
- freemarker用模板输出指定格式word文档
- RabbitMQ与Redis队列对比