洛谷 P1879 玉米田(状压DP入门题)
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入门题)的更多相关文章
- 洛谷P3959 宝藏(状压dp)
传送门 为什么感觉状压dp都好玄学……FlashHu大佬太强啦…… 设$f_{i,j}$表示当前选的点集为$i$,下一次要加入的点集为$j$时,新加入的点和原有的点之间的最小边权.具体的转移可以枚举$ ...
- 洛谷 P3112 后卫马克 —— 状压DP
题目:https://www.luogu.org/problemnew/show/P3112 状压DP...转移不错. 代码如下: #include<iostream> #include& ...
- 【洛谷4941】War2 状压Dp
简单的状压DP,和NOIP2017 Day2 找宝藏 代码几乎一样.(比那个稍微简单一点) f[i][j] ,i代表点的状态,j是当前选择的点,枚举上一个选到的点k 然后从f[i-(1<< ...
- 洛谷 3959 宝藏——枚举+状压dp
题目:https://www.luogu.org/problemnew/show/P3959 原来写了个不枚举起点的状压dp. #include<iostream> #include< ...
- 洛谷P1879 玉米田
题目描述 农场主John新买了一块长方形的新牧场,这块牧场被划分成M行N列(1 ≤ M ≤ 12; 1 ≤ N ≤ 12),每一格都是一块正方形的土地.John打算在牧场上的某几格里种上美味的草,供他 ...
- 洛谷$P3959\ [NOIp2017]$ 宝藏 状压$dp$
正解:状压$dp$ 解题报告: 传送门$QwQ$ $8102$年的时候就想搞这题了,,,$9102$了$gql$终于开始做这题了$kk$ 发现有意义的状态只有当前选的点集和深度,所以设$f_{i,j} ...
- 洛谷 P1433 吃奶酪 状压DP
题目描述 分析 比较简单的状压DP 我们设\(f[i][j]\)为当前的状态为\(i\)且当前所在的位置为\(j\)时走过的最小距离 因为老鼠的坐标为\((0,0)\),所以我们要预处理出\(f[1& ...
- poj 3254 状压dp入门题
1.poj 3254 Corn Fields 状态压缩dp入门题 2.总结:二进制实在巧妙,以前从来没想过可以这样用. 题意:n行m列,1表示肥沃,0表示贫瘠,把牛放在肥沃处,要求所有牛不能相 ...
- 洛谷P2473奖励关——状压DP
题目:https://www.luogu.org/problemnew/show/P2473 还是对DP套路不熟悉... 像这种前面影响后面,而后面不影响前面的问题就应该考虑倒序递推: 看n只有15那 ...
随机推荐
- 关于Select2下拉框组件
文档如下: https://select2.org/configuration/options-api
- (转载)C#使用MemoryStream类读写内存
MemoryStream和BufferedStream都派生自基类Stream,因此它们有很多共同的属性和方法,但是每一个类都有自己独特的用法.这两个类都是实现对内存进行数据读写的功能,而不是对持久性 ...
- 【XSY2745】装饰地板 状压DP 特征多项式
题目大意 你有\(s_1\)种\(1\times 2\)的地砖,\(s_2\)种\(2\times 1\)的地砖. 记铺满\(m\times n\)的地板的方案数为\(f(m,n)\). 给你\(m, ...
- 2018阿里云短信发送DEMO接入简单实例
以下更新2018-04-2309:57:54 后续不再更新, 基本类: app/SignatureHelper.php <?php namespace aliyun_mns; /** * 签名助 ...
- hiho1258 Osu! Master
题目链接:http://hihocoder.com/problemset/problem/1258 题目大意:看能连击的次数 思路:水 看有多少个1和s就好了 #include <stdio.h ...
- 树莓派播放网络磁盘MP3文件
树莓派映射网络磁盘 sudo mount -t cifs -o username=jerry.huang,password=Hello2014 //10.10.0.1/Public/ESLPod.co ...
- Codeforces Round #432 (Div. 1, based on IndiaHacks Final Round 2017) D. Tournament Construction(dp + 构造)
题意 一个竞赛图的度数集合是由该竞赛图中每个点的出度所构成的集合. 现给定一个 \(m\) 个元素的集合,第 \(i\) 个元素是 \(a_i\) .(此处集合已经去重) 判断其是否是一个竞赛图的度数 ...
- CodeForces 97 E. Leaders(点双连通分量 + 倍增)
题意 给你一个有 \(n\) 个点 \(m\) 条边的无向图,有 \(q\) 次询问,每次询问两个点 \(u, v\) 之间是否存在长度为奇数的简单路径. \(1 \le n, m, q \le 10 ...
- Hdoj 2045.不容易系列之(3)—— LELE的RPG难题 题解
Problem Description 人称"AC女之杀手"的超级偶像LELE最近忽然玩起了深沉,这可急坏了众多"Cole"(LELE的粉丝,即"可乐 ...
- 【Loj117】有源汇上下界最小流(网络流)
[Loj117]有源汇上下界最小流(网络流) 题面 Loj 题解 还是模板题. #include<iostream> #include<cstdio> #include< ...