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)的更多相关文章

  1. POJ 3254 Corn Fields(状态压缩DP)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4739   Accepted: 2506 Descr ...

  2. POJ 3254 Corn Fields (状态压缩DP)

    题意:在由方格组成的矩形里面种草,相邻方格不能都种草,有障碍的地方不能种草,问有多少种种草方案(不种也算一种方案). 分析:方格边长范围只有12,用状态压缩dp好解决. 预处理:每一行的障碍用一个状态 ...

  3. POJ 3254. Corn Fields 状态压缩DP (入门级)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9806   Accepted: 5185 Descr ...

  4. poj - 3254 Corn Fields (状态压缩dp入门)

    http://poj.org/problem?id=3254 参考:http://blog.csdn.net/accry/article/details/6607703 农夫想在m*n的土地上种玉米, ...

  5. POJ 3254 Corn Fields状态压缩DP

    下面有别人的题解报告,并且不止这一个状态压缩题的哦···· http://blog.csdn.net/accry/article/details/6607703 下面是我的代码,代码很挫,绝对有很大的 ...

  6. [ACM] POJ 3254 Corn Fields(状态压缩)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8062   Accepted: 4295 Descr ...

  7. poj 3254 Corn Fields 国家压缩dp

    意甲冠军: 要在m行n陆行,有一些格您可以种树,别人做不到的.不相邻的树,我问了一些不同的共同拥有的法律. 分析: 从后往前种,子问题向父问题扩展,当种到某一格时仅仅有他和他后面的n-1个格子的情况对 ...

  8. POJ 3254 Corn Fields 状态压缩

    这题对我真的非常难.实在做不出来,就去百度了,搜到了一种状压DP的方法.这是第一种 详细见凝视 #include <cstdio> #include <cstring> #in ...

  9. poj 3254 Corn Fields_状态压缩dp

    感谢:http://www.cnblogs.com/ka200812/archive/2011/08/11/2135607.html 让我搞懂了. #include <iostream> ...

随机推荐

  1. qt 摄像头程序

    http://www.oschina.net/code/snippet_124925_3789?p=3#comments http://www.codesoso.net/Search?q=qt+%C9 ...

  2. js滚动事件实现滚动触底加载

    移动端触底加载时前端开发过程中常用功能,主要是通过三个值的大小来进行判断: 首先介绍jquery的写法,代码如下: $(window).scroll(function(){ var windowH=$ ...

  3. mysql5.7官网直译SQL语句优化--select语句优化

    8.2 sql语句优化 大致内容如下: 8.2.1:SELECT语句的优化 8.2.2:优化子查询,派生表和试图引用 8.2.3:优化INFORMATION_SCHEMA查询 8.2.4:优化数据改变 ...

  4. Windows下面使用curl

    Windows下面使用curl 学习了:https://www.cnblogs.com/xing901022/p/4652624.html 下载地址:https://curl.haxx.se/down ...

  5. Accessibility辅助控制类

    熟悉Android开发的都知道辅助功能服务 Accessibility service.他的作用有非常多.360豌豆荚等应用市场的非root自己主动安装.微信抢红包插件.盲人辅助程序等等功能都是靠它实 ...

  6. windows编译ffmpeg出现gcc is unable to create an executable file 的普通情况

    近期有个朋友在编译ffmpeg的时候出现这个问题,他非常郁闷. 我就说,为什么我弄的时候就没问题呢??直接./configure +加上后面的參数 安全度过. 然后,我就想了,预计他的gcc的系统变量 ...

  7. EF的CRUD

    已经知道EF就是一个能够使得编程人员用面向对象的思想操作数据库的框架,那么在最初学习SQL的时候我们就知道对数据库的操作就是增删改查.万变不离其宗. EF也是操作数据库的当然也就是要对数据库实现增删改 ...

  8. 1.RunLoop是什么?

    1.Run loops是线程相关的的基础框架的一部分. 一个run loop就是一个事件处理的循环.用来不停的调度工作以及处理输入事件.使用run loop的目的是让你的线程在有工作的时候忙于工作.而 ...

  9. 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 ...

  10. m_Orchestrate learning system---十七、页面美观的关键是什么

    m_Orchestrate learning system---十七.页面美观的关键是什么 一.总结 一句话总结:图片用好看的 1.项目板块化? 就是一个个模块,能复用的话很快的 页面由这一个个模块拼 ...