传送门

https://www.cnblogs.com/violet-acmer/p/9852294.html

题解:

  相关变量解释:

 int M,N;
int plant[maxn][maxn];//草场情况
struct Node
{
int status;//状态
int res;//方案
Node(int a=,int b=):status(a),res(b){}
};
vector<Node >dp[maxn];//dp[i][j] : 第i行的j状态能达到的最大方案

  根据dp定义,很容易写出状态转移方程:

 for(int i=;i <= M;++i)
{
for(int j=;j <= maxNum;++j)
{
int res=Find(j,i-);//查找与上一次决策没有相邻的草地的决策个数
//isSat1() : 判断草地是否合法,即判断不含有相邻草场
//isSat2() : 判断当前决策是否有相邻的草地
if(isSat1(i,j) && isSat2(j) && res)
dp[i].pb(Node(j,res));
}
}

AC代码:

 #include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
#define R(x) (1<<x)
#define pb(x) push_back(x)
const int MOD=1e8;
const int maxn=+; int M,N;
int plant[maxn][maxn];//草场情况
struct Node
{
int status;//状态
int res;//方案
Node(int a=,int b=):status(a),res(b){}
};
vector<Node >dp[maxn];//dp[i][j] : 第i行的j状态能达到的最大方案
bool isSat1(int i,int x)//判断草地是否合法
{
int index=N;
for(int j=;j <= N;++j)
if(plant[i][index--] == && (R(j-)&x) != )
return false;
return true;
}
bool isSat2(int x)//判断当前决策是否有相邻的草地
{
for(int j=;;++j)
{
int val=R(j-)+R(j-);
if(val > x)
return true ;
if((val&x) == val)
return false;
}
return true;
}
int Find(int now,int i)//查找与上一次决策没有相邻的草地的决策个数
{
int res=;
for(int j=;j < dp[i].size();++j)
{
Node node=dp[i][j];
int pre=node.status;
if((pre&now) == )
res=res%MOD+node.res;
}
return res%MOD;
}
void Solve()
{
int maxNum=(<<N)-;
dp[].pb(Node(,));
for(int i=;i <= M;++i)
{
for(int j=;j <= maxNum;++j)
{
int res=Find(j,i-);
if(isSat1(i,j) && isSat2(j) && res)
dp[i].pb(Node(j,res));
}
}
int res=;
for(int i=;i < dp[M].size();++i)
res=res%MOD+dp[M][i].res;
printf("%d\n",res%MOD);
}
int main()
{
scanf("%d%d",&M,&N);
for(int i=;i <= M;++i)
for(int j=;j <= N;++j)
scanf("%d",plant[i]+j);
Solve();
}

洛谷 P1879 玉米田(状压DP入门题)的更多相关文章

  1. 洛谷P3959 宝藏(状压dp)

    传送门 为什么感觉状压dp都好玄学……FlashHu大佬太强啦…… 设$f_{i,j}$表示当前选的点集为$i$,下一次要加入的点集为$j$时,新加入的点和原有的点之间的最小边权.具体的转移可以枚举$ ...

  2. 洛谷 P3112 后卫马克 —— 状压DP

    题目:https://www.luogu.org/problemnew/show/P3112 状压DP...转移不错. 代码如下: #include<iostream> #include& ...

  3. 【洛谷4941】War2 状压Dp

    简单的状压DP,和NOIP2017 Day2 找宝藏 代码几乎一样.(比那个稍微简单一点) f[i][j] ,i代表点的状态,j是当前选择的点,枚举上一个选到的点k 然后从f[i-(1<< ...

  4. 洛谷 3959 宝藏——枚举+状压dp

    题目:https://www.luogu.org/problemnew/show/P3959 原来写了个不枚举起点的状压dp. #include<iostream> #include< ...

  5. 洛谷P1879 玉米田

    题目描述 农场主John新买了一块长方形的新牧场,这块牧场被划分成M行N列(1 ≤ M ≤ 12; 1 ≤ N ≤ 12),每一格都是一块正方形的土地.John打算在牧场上的某几格里种上美味的草,供他 ...

  6. 洛谷$P3959\ [NOIp2017]$ 宝藏 状压$dp$

    正解:状压$dp$ 解题报告: 传送门$QwQ$ $8102$年的时候就想搞这题了,,,$9102$了$gql$终于开始做这题了$kk$ 发现有意义的状态只有当前选的点集和深度,所以设$f_{i,j} ...

  7. 洛谷 P1433 吃奶酪 状压DP

    题目描述 分析 比较简单的状压DP 我们设\(f[i][j]\)为当前的状态为\(i\)且当前所在的位置为\(j\)时走过的最小距离 因为老鼠的坐标为\((0,0)\),所以我们要预处理出\(f[1& ...

  8. poj 3254 状压dp入门题

    1.poj 3254  Corn Fields    状态压缩dp入门题 2.总结:二进制实在巧妙,以前从来没想过可以这样用. 题意:n行m列,1表示肥沃,0表示贫瘠,把牛放在肥沃处,要求所有牛不能相 ...

  9. 洛谷P2473奖励关——状压DP

    题目:https://www.luogu.org/problemnew/show/P2473 还是对DP套路不熟悉... 像这种前面影响后面,而后面不影响前面的问题就应该考虑倒序递推: 看n只有15那 ...

随机推荐

  1. C# 获取文件详细备注信息 (如图片、视频实际创建时间)

    在整理照片/视频时想根据实际拍摄时间重命名文件,但 System.IO.FileInfo 只能获取到文件的创建时间或最后写入时间,不符合要求,遂寻找解决方案 方案 1: System.Drawing ...

  2. Linux命令替换字符串

    :%s/str1/str2/ 用str2替换str1

  3. moogodb 安装及简单介绍

    1,安装Moogodb 因为是windows 64位操作系统,直接到官网上下载.msi文件,下载完成后点击安装,点击同意协议之后,出现下面的对话框, Choose Setup Type, 就是选择安装 ...

  4. codeforces732C

    Sanatorium CodeForces - 732C Vasiliy spent his vacation in a sanatorium, came back and found that he ...

  5. 【C/C++】求解线性方程组的雅克比迭代与高斯赛德尔迭代

    雅克比迭代: /* 方程组求解的迭代法: 雅克比迭代 */ #include<bits/stdc++.h> using namespace std; ][]; ]; void swapA( ...

  6. 部署 Django

    补充说明:关于项目部署,历来是开发和运维人员的痛点.造成部署困难的主要原因之一是大家的Linux环境不同,这包括发行版.解释器.插件.运行库.配置.版本级别等等太多太多的细节.因此,一个成功的部署案例 ...

  7. 微信小程序——代码片段汇集

    导航栏 作者:beatzcs       链接:https://www.jianshu.com/p/c681007a6287 这个导航虽然已经很完善了,不过还是要根据自己的来进行修改的 tabs.wx ...

  8. Codeforces1073E Segment Sum 【数位DP】

    题目分析: 裸的数位DP,注意细节. #include<bits/stdc++.h> using namespace std; ; int k; ][],sz[][],cnt[][]; ] ...

  9. SpringMVC 集成Log4j

    项目地址:https://github.com/xiaoqiu-duan/DataProject.git 1.添加jar <dependency> <groupId>org.s ...

  10. Matplotlib学习---用matplotlib画雷达图(radar chart)

    雷达图常用于对多项指标的全面分析.例如:HR想要比较两个应聘者的综合素质,用雷达图分别画出来,就可以进行直观的比较. 用Matplotlib画雷达图需要使用极坐标体系,可点击此链接,查看对极坐标体系的 ...