poj 3254(状态压缩+动态规划)
http://poj.org/problem?id=3254
题意:有一个n*m的农场(01矩阵),其中1表示种了草可以放牛,0表示没种草不能放牛,并且如果某个地方放了牛,它的上下左右四个方向都不能放其他的牛,
问总共有多少种放牛方案??(不放也是一种方案)
分析:利用状态压缩进行求解,先筛选出每行所有的可能状态,然后将每行与所有可行状态进行比较。
dp[i][j]表示当第i行的状态为j时前i行的放牛方案总数。
所以状态转移方程便是 dp[i][j] = dp[i][j]+dp[i-1][t] //t代表第i-1行所有符合条件的状态数。
最后的结果为 sum(dp[n][i]) ..数组开小了,不停WA
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define N 12
#define mod 100000000
using namespace std;
int dp[N+][<<N]; ///dp[i][j]表示当第i行的状态为j时前i行的放牛方案总数
int state[<<N]; ///保存所有的合法状态数
int cur[N+]; ///每一行的状态,注意这里保存的是0,因为当我们保存0时,如果某一状态与当前行相与不为0,那么
///就能判断出那个状态是不合法的(假设那个位置不应该种草,而它种了草)
int n,m;
bool check(int k){
if(k&(k<<)) return false;
return true;
}
void init(int &k){
for(int i=;i<(<<m);i++){
if(check(i)) state[++k]=i;
}
//printf("%d\n",k);
} int main()
{
while(scanf("%d%d",&n,&m)!=EOF){
int k = ;
init(k);
int num;
memset(dp,,sizeof(dp));
for(int i=;i<=n;i++){
cur[i]=;
for(int j=;j<=m;j++){
scanf("%d",&num);
if(num==) cur[i]+=(<<(j-));
}
}
for(int i=;i<=k;i++){
if(!(cur[]&state[i])){
dp[][i]=;
}
}
for(int i=;i<=n;i++){
for(int j=;j<=k;j++){
if(cur[i]&state[j]) continue; ///枚举第i行的可行状态state[j]
for(int t = ;t<=k;t++){
if(cur[i-]&state[t]) continue; ///枚举第i-1行的可行状态state[t]
if(state[j]&state[t]) continue; ///判断相邻两行状态是否合法
dp[i][j] = (dp[i][j]+dp[i-][t]+mod)%mod;
}
}
}
int ans = ;
for(int i=;i<=k;i++){
ans = (ans+dp[n][i]+mod)%mod;
}
printf("%d\n",ans);
}
return ;
}
poj 3254(状态压缩+动态规划)的更多相关文章
- poj 3254 状态压缩DP
思路:把每行的数当做是一个二进制串,0不变,1变或不变,找出所有的合法二进制形式表示的整数,即相邻不同为1,那么第i-1行与第i行的状态转移方程为dp[i][j]+=dp[i-1][k]: 这个方程得 ...
- poj 3254 状态压缩
Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 15285 Accepted: 8033 Desc ...
- POJ 3254 状态压缩 DP
B - Corn Fields Crawling in process... Crawling failed Time Limit:2000MS Memory Limit:65536KB ...
- BZOJ_4197_[Noi2015]寿司晚宴_状态压缩动态规划
BZOJ_4197_[Noi2015]寿司晚宴_状态压缩动态规划 Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被 ...
- 状态压缩动态规划 状压DP
总述 状态压缩动态规划,就是我们俗称的状压DP,是利用计算机二进制的性质来描述状态的一种DP方式 很多棋盘问题都运用到了状压,同时,状压也很经常和BFS及DP连用,例题里会给出介绍 有了状态,DP就比 ...
- 【学术篇】状态压缩动态规划——POJ3254/洛谷1879 玉米田Corn Field
我要开状压dp的坑了..直播从入门到放弃系列.. 那就先拿一道状压dp的水题练练手吧.. 然后就找到了这一道..这道题使我清醒地认识到阻碍我的不是算法,而是视力= = 传送门: poj:http:// ...
- 状态压缩动态规划(状压DP)详解
0 引子 不要999,也不要888,只要288,只要288,状压DP带回家.你买不了上当,买不了欺骗.它可以当搜索,也可以卡常数,还可以装B,方式多样,随心搭配,自由多变,一定符合你的口味! 在计算机 ...
- POJ 1185 状态压缩DP(转)
1. 为何状态压缩: 棋盘规模为n*m,且m≤10,如果用一个int表示一行上棋子的状态,足以表示m≤10所要求的范围.故想到用int s[num].至于开多大的数组,可以自己用DFS搜索试试看:也可 ...
- 状态压缩动态规划 -- 棋盘问题 POJ 1321
一个 N * N 的棋盘上面,有些格子不能放,放置 M 的棋子, 每两个棋子不能在同一行或者同一列,问有多少种放法 DFS太慢,用SCR好点点 Python 仅仅有 22 行,事实上能够更短.可是得排 ...
随机推荐
- WebStorm强大的调试JavaScript功能(转载)
一.JavaScript的调试 目前火狐和Chrome都具备调试JavaScript的功能,而且还是相当的强大.如果纯粹是用浏览器来进行js调试的话,我比较喜欢用火狐.火狐可以安装各种插件,真的是非常 ...
- C++版本的C标准库头文件的特点
C++标准库中除了定义C++语言特有的功能外,也兼容了C语言的标准库.C语言的头文件形如name.h,C++则将这些文件命名为cname.也就是去掉了.h后缀,而在文件名name之前添加了字母c,这里 ...
- [Elasticsearch] 多字段搜索 (五) - 以字段为中心的查询
以字段为中心的查询(Field-centric Queries) 上述提到的三个问题都来源于most_fields是以字段为中心(Field-centric),而不是以词条为中心(Term-centr ...
- 【python】 json.dumps() json.dump()的区别
以前写的很简单,只有几句话,最近发现本文是本博客阅读量最大的一篇文章,觉得这样有种把人骗进来的感觉,于是又细化了一些.如果还有不好的地方,欢迎指出. 首先说明基本功能: dumps是将dict转化成s ...
- java实现数据库连接的工具类
第一种 (带事务) package com.china.util; import java.sql.Connection; import java.sql.DriverManager; import ...
- BZOJ4419 SHOI2013发微博(平衡树)
好友状态的变化次数不会超过m,于是考虑暴力,对每个人记录其好友关系的变化,通过前缀和计算贡献.这需要查询一段前缀时间内某人发的微博数量,可以离线建一棵绝对平衡的平衡树.事实上完全可以线性. #incl ...
- 如何把阿里云的服务器配置为mac的共享文件夹(亲测有效)
写在开头的就是,我只能百分之九十确定这个是真的有效....毕竟试了太多的方法,最后莫名其妙的就好了.. - -# 基础的步骤就不说了,网上一搜一大把,大家可能follow了所有的步骤以后发现还是连接不 ...
- Codeforces Round #348 (VK Cup 2016 Round 2, Div. 2 Edition) D
D. Little Artem and Dance time limit per test 2 seconds memory limit per test 256 megabytes input st ...
- 普通table表格样式及代码大全
普通table表格样式及代码大全(全)(一) 单实线边框表格 <table style="border-collapse: collapse" borderColor=#0 ...
- JavaScript学习笔记——浅拷贝、深拷贝
参考自:http://www.cnblogs.com/yichengbo/archive/2014/07/10/3835882.html 一.数组的深浅拷贝 在使用JavaScript对数组进行操作的 ...