洛谷 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那 ...
随机推荐
- tensorflow点滴笔记
1.模型保存 模型保存需要使用函数 tf.train.Saver(), a)创建saver时,可以指定需要存储的tensor,如果没有指定,则全部保存. b) 创建saver时,可以指定保存的模型个数 ...
- Lodop的JS模版代码、文档式模版 生成加载赋值博文索引
Lodop获取全部JS代码,传统JS模版的生成.LODOP设置打印设计返回JS代码是变量 LodopJS代码模版的加载和赋值 Lodop生成文档式模版 LodopJS文档式模版的加载和赋值 由于加载J ...
- 只要访问url地址 那么容器就会根据地址进行对象的创建
只要访问url地址 那么容器就会根据地址进行对象的创建
- #186 path(容斥原理+状压dp+NTT)
首先只有一份图时显然可以状压dp,即f[S][i]表示S子集的哈密顿路以i为终点的方案数,枚举下个点转移. 考虑容斥,我们枚举至少有多少条原图中存在的边(即不合法边)被选进了哈密顿路,统计出这个情况下 ...
- 牛客寒假算法训练1 D 欧拉(容斥)
1 #include<bits/stdc++.h> using namespace std; ; typedef long long ll; int p[maxn],a[maxn]; ll ...
- codeforces 997C.Sky Full of Stars
题目链接:codeforces 997C.Sky Full of Stars 一道很简单(?)的推式子题 直接求显然不现实,我们考虑容斥 记\(f(i,j)\)为该方阵中至少有\(i\)行和\(j\) ...
- 对如下字符串(234453)[234]{2324}分析它的括号使用是否正确,括号匹配(Java实现)
我的一种思路是递归: private static String s = "(2344[)]53[234]{2324}"; private static boolean f(int ...
- eclipse 保存html 提示 save could not be completed
重启ecplise 即可
- 【总结】字符串hash
序列字符串\(Hash\) 直接hash即可qwq 预处理:\(Hash[3][i]\)(\(Hash\)值),\(Pow[3][i]\)(用来乘系数) 判断相等:\(box_1=Hash[3][i] ...
- 【BZOJ3142】[HNOI2013]数列(组合计数)
[BZOJ3142][HNOI2013]数列(组合计数) 题面 BZOJ 洛谷 题解 唯一考虑的就是把一段值给分配给\(k-1\)天,假设这\(k-1\)天分配好了,第\(i\)天是\(a_i\),假 ...