POJ 3254 (状压DP) Corn Fields
基础的状压DP,因为是将状态压缩到一个整数中,所以会涉及到很多比较巧妙的位运算。
我们可以先把输入中每行的01压缩成一个整数。
判断一个状态是否有相邻1:
如果 x & (x << 1) 非0,说明有相邻的两个1
判断一个状态能否放在该行:
如果 (a[i] & state) != state,说明是不能放置的。因为a[i]中存在某个0和对应state中的1,与运算之后改变了state的值
判断相邻两行的状态是否有同一列相邻的1:
如果(state & _state)不为零,说明有相邻的1
#include <cstdio>
#include <cstring> const int maxn = ;
const int M = ;
int a[maxn], d[maxn][ << maxn];
int n, m, tot; inline bool check_row(int x) { return x & (x << ) ? false : true; } //判断一行是否有相邻的
inline bool check_col(int x1, int x2) { return x1 & x2 ? false : true; } //判断一列是否有相邻的
inline bool check_put(int a, int x) { return (x & a) == x ? true : false; } //判断该状态能否放在该行 int main()
{
//freopen("in.txt", "r", stdin); while(scanf("%d%d", &n, &m) == )
{
memset(d, , sizeof(d));
for(int i = ; i < n; i++)
{
int t;
a[i] = ;
for(int j = ; j < m; j++) { scanf("%d", &t); a[i] = a[i] * + t; }
}
tot = ( << m);
for(int i = ; i < tot; i++) if(check_row(i) && check_put(a[], i)) d[][i] = ; for(int i = ; i < n; i++)
{//枚举行标
for(int state = ; state < tot; state++)
{//枚举该行的状态
if(!check_row(state) || !check_put(a[i], state)) continue;
for(int _state = ; _state < tot; _state++)
{//枚举上一行的状态
if(state & _state) continue;
d[i][state] = (d[i][state] + d[i-][_state]) % M;
}
}
} int ans = ;
for(int i = ; i < tot; i++) ans = (ans + d[n-][i]) % M;
printf("%d\n", ans);
} return ;
}
代码君
POJ 3254 (状压DP) Corn Fields的更多相关文章
- hdu 3254 (状压DP) Corn Fields
poj 3254 n乘m的矩阵,1表示这块区域可以放牛,0,表示不能,而且不能在相邻的(包括上下相邻)两个区域放牛,问有多少种放牛的方法,全部不放也是一种方法. 对于每块可以放牛的区域,有放或者不放两 ...
- poj 3254 状压dp入门题
1.poj 3254 Corn Fields 状态压缩dp入门题 2.总结:二进制实在巧妙,以前从来没想过可以这样用. 题意:n行m列,1表示肥沃,0表示贫瘠,把牛放在肥沃处,要求所有牛不能相 ...
- POJ 3254 状压DP
题目大意: 一个农民有一片n行m列 的农场 n和m 范围[1,12] 对于每一块土地 ,1代表可以种地,0代表不能种. 因为农夫要种草喂牛,牛吃草不能挨着,所以农夫种菜的每一块都不能有公共边. ...
- POJ 3254 状压DP(基础题)
Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 17749 Accepted: 9342 Desc ...
- Corn Fields(POJ 3254状压dp)
题意: n*m网格1能放0不能放 放的格子不能相邻 求一共多少种可放的方案. 分析: dp[i][j]第i行可行状态j的的最大方案数,枚举当前行和前一行的所有状态转移就行了(不放牛也算一种情况) #i ...
- poj 1170状压dp
题目链接:https://vjudge.net/problem/POJ-1170 题意:输入n,表示有那种物品,接下来n行,每行a,b,c三个变量,a表示物品种类,b是物品数量,c代表物品的单价.接下 ...
- POJ 2411 状压DP经典
Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 16771 Accepted: 968 ...
- poj 1185(状压dp)
题目链接:http://poj.org/problem?id=1185 思路:状态压缩经典题目,dp[i][j][k]表示第i行状态为j,(i-1)行状态为k时最多可以放置的士兵个数,于是我们可以得到 ...
- POJ 2441 状压DP
Arrange the Bulls Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 5289 Accepted: 2033 ...
随机推荐
- function的prototype
prototype只有function才有的属性. var a = function() { this.age = 12; this.name = "haha"; }; a.pro ...
- Request/Server的相关topic
Request---------Server模式 HTTP 协议--------->这个可能返回json, 也可能是HTML HTML页面处理的流程以及资源文件的加载 浏览器最大连接数 js资源 ...
- linux - 使用curl实现新浪天气API应用
新浪天气API的使用方法: API地址:http://php.weather.sina.com.cn/xml.php?city=%B1%B1%BE%A9&password=DJOYnieT82 ...
- Sqli-labs less 37
Less-37 本关与34关是大致相似的,区别在于处理post内容用的是mysql_real_escape_string()函数,而不是addslashes()函数,但是原理是一直的,上面我们已经分析 ...
- 使用动态SQL语句实现简单的行列转置(动态产生列)
原始数据如下图所示:(商品的销售明细)date=业务日期:Item=商品名称:saleqty=销售数量: -- 建立测试数据(表)create table test (Date varchar(10) ...
- Linux中ping命令
Linux系统的ping命令是常用的网络命令,它通常用来测试与目标主机的连通性,我们经常会说“ping一下某机器,看是不是开着”.不能打开网页时会说“你先ping网关地址192.168.1.1试试”. ...
- iOS 应用内付费(IAP)开发步骤
折腾好几天,原来是税务信息没有填写,哎... 国内就是好啊,没有这些麻烦的事情... :) 等24小时,等税务的审核结果... 有结论了 才能测试内购.... 如果税务信息没有填写完毕,p ...
- jq 幻灯片插件制作
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- Java 包装类中的静态函数
所有的核心类型转化 全是基于这个图的 是不是很简单 so easy~~~ 不过下面的这些函数也是很重要的哦~~~ 以后就可以随意发挥了 猜API吧!
- React事件属性
一.简介 二.滚动例子,滚动改变颜色 <!DOCTYPE html> <html lang="zh-cn"> <head> <meta c ...