题意:略。

思路:第一次做状态压缩的dp。

在这里说一下状态压缩的原则。因为每一行只有最多12个格子,每个格子只有1(可放牛)和0(不可放牛)两种状态,这总共是2^12种状态,直接用一个int整型变量从0枚举到2^12 - 1。对于每一个数,将其转换成二进制,先判断格子为0时该数二进制对应位上是不是1,若是则该状态不可行。其次再判断该数相邻的两位有没有同时为1的情况,如果有,该状态也不可行。

递推公式就是:dp[i][k] = dp[j][k-1]。

其中dp[i][k]表示在牧场第k行状态为i时可行解的数量。它等于上一层所有可行状态的可行解数量之和。

在dp过程中,在判断该层的上一层某状态是否可行时,需要判断两层状态有没有上下相邻的位同为1的情况,如果有,则上一层的状态不可行,跳过。

此外在计算可行解数量和时别忘了取模。

 #include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#define pri 100000000
using namespace std;
int m, n;
int farm[][];
int dp[<<][];
bool judge(int i,int pos)//判断状态i在牧场第pos行是否合法
{
int now = n;
int last = ;
while (now)
{
int num = i % ;
if (!farm[pos][now] && num || (last && num)) return ;
last = num;
i /= ;
now--;
}
return ;
}
bool judge_state(int i,int j)//判断状态i和j能否放在牧场上下相邻的两行
{
int now = n;
while (now)
{
if ((i % ) && (j % )) return ;
i /= ;
j /= ;
now--;
}
return ;
}
int getdp()
{
memset(dp, , sizeof(dp));
for (int i = ; i < (<<n); i++)//初始化第一行
if (judge(i, )) dp[i][] = ;
for (int i = ; i <= m; i++)//枚举牧场剩下的每一行
for (int j = ; j < (<<n); j++) if (judge(j, i))//枚举该行可行的状态
for (int k = ; k < (<<n); k++) if (dp[k][i-])//枚举上一行可行的状态
if (judge_state(j, k))
{
dp[j][i] += dp[k][i-];
dp[j][i] %= pri;
}
int res = ;
for (int i = ; i < (<<n); i++)
{
res += dp[i][m];
res %= pri;
}
return res; }
int main()
{
scanf("%d%d", &m, &n);
for (int i = ; i <= m; i++)
for (int j = ; j <= n; j++)
scanf("%d", &farm[i][j]);
printf("%d", getdp());
return ;
}

POJ 3254 Corn Fields [DP]的更多相关文章

  1. 状压DP POJ 3254 Corn Fields

    题目传送门 /* 状态压缩DP:先处理硬性条件即不能种植的,然后处理左右不相邻的, 接着就是相邻两行查询所有可行的种数并累加 写错一个地方差错N久:) 详细解释:http://www.tuicool. ...

  2. poj - 3254 - Corn Fields (状态压缩)

    poj - 3254 - Corn Fields (状态压缩)超详细 参考了 @外出散步 的博客,在此基础上增加了说明 题意: 农夫有一块地,被划分为m行n列大小相等的格子,其中一些格子是可以放牧的( ...

  3. poj 3254 Corn Fields

    http://poj.org/problem?id=3254 Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissio ...

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

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

  5. POJ 3254 Corn Fields(状压DP)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 13732   Accepted: 7216 Desc ...

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

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

  7. poj 3254 Corn Fields 国家压缩dp

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

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

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

  9. POJ 3254 - Corn Fields - [状压DP水题]

    题目链接:http://poj.org/problem?id=3254 Time Limit: 2000MS Memory Limit: 65536K Description Farmer John ...

随机推荐

  1. 【转】Oracle AWR 报告 每天自动生成并发送邮箱 Python脚本(一)

    Oracle 的AWR 报告能很好的提供有关DB性能的信息. 所以DBA 需要定期的查看AWR的报告. 有关AWR报告的说明参考: Oracle AWR 介绍 http://blog.csdn.net ...

  2. JS的跨域理解

    前言 周一的学院点开题被批的很惨,换了个校长,各种被抓严,班上已经有两个同学打算休学了.哎,这周的聚会可能是大家集聚的最后一次吧.熬着吧,还是学习我的前端,不管老板学校咋逼了,找个好工作才是王道.今天 ...

  3. day02_03.五个数字一行输出

    第3题 5个数字一行输出 每当你做一道题目时,记住要明确你的目的是什么 你的代码执行出来会是一个什么效果 然后根据你想要的这个效果去编辑代码 题目:输出1~100(不包含100)之间的偶数,5个数字一 ...

  4. Python 操作 PostgreSQL 数据库

    我使用的是 Python 3.7.0 PostgreSQL可以使用psycopg2模块与Python集成. sycopg2是用于Python编程语言的PostgreSQL数据库适配器. psycopg ...

  5. [oldboy-django][2深入django]django 官方中文文档 --扩展User

    https://docs.djangoproject.com/en/2.0/topics/auth/customizing/#extending-the-existing-user-model # 另 ...

  6. 使用原app接口进行微信公众号开发

    1.跨域问题 原来的app项目已经上线,然而接下来就有意思了,突然上头说要把app的发件功能复制到微信公众号里.那么问题来了,微信公众号的页面是前端和交互式h5大哥写的. 那么就将页面丢微信里,请求我 ...

  7. poj3083 Children of the Candy Corn BFS&&DFS

    Children of the Candy Corn Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11215   Acce ...

  8. 优化脚本性能 Optimizing Script Performance

    This page gives some general hints for improving script performance on iOS. 此页面提供了一些一般的技巧,提高了在iOS上的脚 ...

  9. CodeForces Round #521 (Div.3) A. Frog Jumping

    http://codeforces.com/contest/1077/problem/A A frog is currently at the point 00 on a coordinate axi ...

  10. "二进制" 转化为 "十六进制

    //"二进制" 转化为 "十六进制" void To_string(uint8 *dest,char * src,uint8 length) { uint8 * ...