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. 【codeforces 746E】Numbers Exchange

    [题目链接]:http://codeforces.com/problemset/problem/746/E [题意] 你有n张卡片,上面写着不同的数字; 然后另外一个人有m张上面写着不同的数字的卡片: ...

  2. ASP.NET-服务器客户端的信息保持

    ASP.NET客户端和服务器端的信息保持方案 来自为知笔记(Wiz)

  3. github上Devstack的一些变动,截至8.20

    从github下直接clone下来的代码在执行之前须要对一些文件进行改动,否则会出现关于REQUIREMENTS的错误 说明:代码前边是"-"号的,须要删除,代码前边是" ...

  4. Knockout源代码精析-怎样解析demo元素,获取到bindings(二)?

    接上文这里開始分析applyBindingsToNodeInternal.applyBindingsToNodeInternal方法例如以下: function applyBindingsToNode ...

  5. 上传文件 nginx 413错误

    nginx : 413 Request Entity Too Large 上传文件过程发生413 Request Entity Too Large错误,翻译为请求实体过大,断定为nginx限制了请求体 ...

  6. [JZOJ 4307] [NOIP2015模拟11.3晚] 喝喝喝 解题报告

    题目链接: http://172.16.0.132/senior/#main/show/4307 题目: 解题报告: 题目询问我们没出现坏对的连续区间个数 我们考虑从左到有枚举右端点$r$,判断$a[ ...

  7. Kali linux 2016.2 的 plyload模块之meterpreter plyload详解

    不多说,直接上干货! 前期博客 Kali linux 2016.2(Rolling)中的payloads模块详解 当利用成功后尝试运行一个进程,它将在系统进程列表里显示,即使在木马中尝试执行系统命令, ...

  8. JS的数据类型(包含:7种数据类型的介绍、数据类型的转换、数据类型的判断)

    前言 最新的 ECMAScript 标准定义了JS的 7 种数据类型,其中包括: 6 种基本类型:Boolean.Null.Undefined.Number.String.Symbol (ECMASc ...

  9. JAR包放在WEB-INF/lib子目录报ClassNotFoundException解决方案

    对于Java Web应用依赖的jar包,我们通常会放到WEB-INF/lib目录下,但是笔者喜欢把不同框架的jar包放在不同的子目录下,例如新建一个struts目录存放struts框架的jar包等. ...

  10. SpringCloud学习笔记(14)----Spring Cloud Netflix之Hystrix对Feign的支持

    1. Hystrix对Feign的支持 添加Feign中IUserBiz的实现类HystrixFallBack: package com.wangx.cloud.springcloud02consum ...