POJ 3254 Corn Fields 状态压缩DP (C++/Java)
id=3254">http://poj.org/problem? id=3254
题目大意:
一个农民有n行m列的地方,每一个格子用1代表能够种草地,而0不能够。放牛仅仅能在有草地的。可是相邻的草地不能同一时候放牛。 问总共同拥有多少种方法。
思路:
状态压缩的DP。
能够用二进制数字来表示放牧情况并推断该状态是否满足条件。
这题的限制条件有两个:
1.草地限制。
2.相邻限制。
对于草地限制,由于输入的时候1是能够种草地的。
以”11110“草地分析,就仅仅有最后一个是不能够种草的。
取反后得00001 。(为啥取反?不取反能够举出反例的)
如果有个状态10101 这个不相邻,可是10101 & 00001 !=0 表示有冲突。
对于相邻限制,又分为同一行的限制和上下两行的限制。
同一行限制能够一開始把相邻的情况都去掉,符合的存进数组,有助于降低状态数。 这样这个也攻克了。
上下两行相与就可以。
如(如果均可种草)
10101 & 00100!=0 也是有冲突的。
OK上代码。
C++:
#include<cstdio>
#include<cstring>
const int mod = 100000000;
const int MAXN = 1 << 12;
int map[20], status[MAXN], dp[20][MAXN];
int len; int main()
{
int n, m;
while (~scanf("%d%d", &n, &m))
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
int temp;
scanf("%d", &temp);
if (!temp)
map[i] = map[i] | (1 << (m - j - 1));
}
} len = 0;
int tot = 1 << m;
//全部状态
for (int i = 0; i < tot; i++)
{
//左移右移均可
if ((i &(i >> 1)) == 0) status[len++] = i;
}
//初始化第一行
memset(dp, 0, sizeof(dp));
for (int i = 0; i <len ; i++)
{
if ((status[i] & map[0]) == 0)
dp[0][i] = 1;
} for (int i = 1; i < n; i++)
{
for (int j = 0; j < len; j++)
{
if ((status[j] & map[i-1]) != 0) continue;
for (int k = 0; k < len; k++)
{
if ((status[k] & map[i]) != 0) continue;
if ((status[k] & status[j]) != 0) continue;
dp[i][k] = (dp[i][k] +dp[i - 1][j] )% mod;
}
}
}
int ans = 0;
for (int i = 0; i < len; i++)
ans = (ans + dp[n - 1][i]) % mod;
printf("%d\n", ans);
}
return 0;
}
JAVA:
import java.util.Scanner;
public class Main {
final static int mod = 100000000;
final static int MAXN = 1 << 12;
static int[] map = new int[20];
static int[] status = new int[MAXN];
static int[][] dp = new int[20][MAXN];
static int len;
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int n, m;
while (cin.hasNext()) {
n = cin.nextInt();
m = cin.nextInt();
init(n,m);
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++) {
int temp = cin.nextInt();
if (temp ==0)
map[i] = (map[i] | (1 << (m - j - 1)));
}
int tot = 1 << m;
len = 0;
for (int i = 0; i < tot; i++)
if ((i & (i << 1)) == 0) {
status[len++] = i;
}
for (int i = 0; i < len; i++) {
if ((map[0] & status[i]) == 0)
dp[0][i] = 1;
}
for (int i = 1; i < n; i++) {
for (int j = 0; j < len; j++) {
if ((map[i - 1] & status[j]) != 0)
continue;
for (int k = 0; k < len; k++) {
if ((map[i] & status[k]) != 0)
continue;
if ((status[j] & status[k]) != 0)
continue;
dp[i][k] = (dp[i][k] + dp[i - 1][j]) % mod;
}
}
}
int ans = 0;
for (int i = 0; i < len; i++) {
ans = (ans + dp[n - 1][i]) % mod;
}
System.out.println(ans);
}
}
public static void init(int n,int m)
{
int tot=1<<m;
for(int i=0;i<n;i++)
{
map[i]=0;
for(int j=0;j<tot;j++)
dp[i][j]=0;
}
}
}
POJ 3254 Corn Fields 状态压缩DP (C++/Java)的更多相关文章
- POJ 3254 Corn Fields(状态压缩DP)
Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4739 Accepted: 2506 Descr ...
- POJ 3254 Corn Fields (状态压缩DP)
题意:在由方格组成的矩形里面种草,相邻方格不能都种草,有障碍的地方不能种草,问有多少种种草方案(不种也算一种方案). 分析:方格边长范围只有12,用状态压缩dp好解决. 预处理:每一行的障碍用一个状态 ...
- POJ 3254. Corn Fields 状态压缩DP (入门级)
Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9806 Accepted: 5185 Descr ...
- poj - 3254 Corn Fields (状态压缩dp入门)
http://poj.org/problem?id=3254 参考:http://blog.csdn.net/accry/article/details/6607703 农夫想在m*n的土地上种玉米, ...
- POJ 3254 Corn Fields状态压缩DP
下面有别人的题解报告,并且不止这一个状态压缩题的哦···· http://blog.csdn.net/accry/article/details/6607703 下面是我的代码,代码很挫,绝对有很大的 ...
- [ACM] POJ 3254 Corn Fields(状态压缩)
Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 8062 Accepted: 4295 Descr ...
- poj 3254 Corn Fields 国家压缩dp
意甲冠军: 要在m行n陆行,有一些格您可以种树,别人做不到的.不相邻的树,我问了一些不同的共同拥有的法律. 分析: 从后往前种,子问题向父问题扩展,当种到某一格时仅仅有他和他后面的n-1个格子的情况对 ...
- POJ 3254 Corn Fields 状态压缩
这题对我真的非常难.实在做不出来,就去百度了,搜到了一种状压DP的方法.这是第一种 详细见凝视 #include <cstdio> #include <cstring> #in ...
- poj 3254 Corn Fields_状态压缩dp
感谢:http://www.cnblogs.com/ka200812/archive/2011/08/11/2135607.html 让我搞懂了. #include <iostream> ...
随机推荐
- qt 摄像头程序
http://www.oschina.net/code/snippet_124925_3789?p=3#comments http://www.codesoso.net/Search?q=qt+%C9 ...
- js滚动事件实现滚动触底加载
移动端触底加载时前端开发过程中常用功能,主要是通过三个值的大小来进行判断: 首先介绍jquery的写法,代码如下: $(window).scroll(function(){ var windowH=$ ...
- mysql5.7官网直译SQL语句优化--select语句优化
8.2 sql语句优化 大致内容如下: 8.2.1:SELECT语句的优化 8.2.2:优化子查询,派生表和试图引用 8.2.3:优化INFORMATION_SCHEMA查询 8.2.4:优化数据改变 ...
- Windows下面使用curl
Windows下面使用curl 学习了:https://www.cnblogs.com/xing901022/p/4652624.html 下载地址:https://curl.haxx.se/down ...
- Accessibility辅助控制类
熟悉Android开发的都知道辅助功能服务 Accessibility service.他的作用有非常多.360豌豆荚等应用市场的非root自己主动安装.微信抢红包插件.盲人辅助程序等等功能都是靠它实 ...
- windows编译ffmpeg出现gcc is unable to create an executable file 的普通情况
近期有个朋友在编译ffmpeg的时候出现这个问题,他非常郁闷. 我就说,为什么我弄的时候就没问题呢??直接./configure +加上后面的參数 安全度过. 然后,我就想了,预计他的gcc的系统变量 ...
- EF的CRUD
已经知道EF就是一个能够使得编程人员用面向对象的思想操作数据库的框架,那么在最初学习SQL的时候我们就知道对数据库的操作就是增删改查.万变不离其宗. EF也是操作数据库的当然也就是要对数据库实现增删改 ...
- 1.RunLoop是什么?
1.Run loops是线程相关的的基础框架的一部分. 一个run loop就是一个事件处理的循环.用来不停的调度工作以及处理输入事件.使用run loop的目的是让你的线程在有工作的时候忙于工作.而 ...
- Educational Codeforces Round 6 C. Pearls in a Row set
C. Pearls in a Row There are n pearls in a row. Let's enumerate them with integers from 1 to n from ...
- m_Orchestrate learning system---十七、页面美观的关键是什么
m_Orchestrate learning system---十七.页面美观的关键是什么 一.总结 一句话总结:图片用好看的 1.项目板块化? 就是一个个模块,能复用的话很快的 页面由这一个个模块拼 ...