C++ 洛谷 P1879 [USACO06NOV]玉米田Corn Fields
合法布阵问题
P1879 [USACO06NOV]玉米田Corn Fields
题意:给出一个n行m列的草地(n,m<=12),1表示肥沃,0表示贫瘠,现在要把一些牛放在肥沃的草地上,但是要求所有牛不能相邻,问你有多少种放法。
分析:假如我们知道每行都有x种合法放法(也就是x种状态),所以对于第i行就有x种放法,那么对于第i+1行的每种放法就有对应的x种放法。
所以定义dp[i][j]表示第i行状态为j时的方法数(j=0,j<=x;j++),有转移方程:dp[i][j]=sum(dp[i-1][k]) k表示i-1行的状态(k=0,k<=x;k++)。
然而,动归方程想出来了还远远不够……/*orz_wa*/
1、预处理第i行的草地map[i],用一个二进制数表示,1表示不能放,0表示可以放。如map[1]=15,转成二进制数就是01111,就说明是 放,不放,不放,不放,不放。二进制的神奇!!!
(常理应该是1能放 0不能放,具体原因等下就知道了,主要是方便位运算)。
2、预处理第i行符合条件(不相邻)的状态st[i],每行共有(1<<m)-1种状态(一个点2种,二个点4种,三个点8种……)。(i=1;i<=(1<<m)-1;i++)
但是很多是相邻的,怎么判断某一状态是否相邻:i&(i<<1)
3、怎么处理肥沃贫瘠问题呢,对于第i行的地形map[i]和某一状态st[k],如果map[i]&st[k]>=1(如map[2]=10010,st[2]=01110,那么map[2]&st[2]=00010=2>1,所以重复了,关键:同1为1,否则为0)即说明出现了放到贫瘠草地的情况
4、对于第i行不和i-1行相邻,st[i]&st[i-1]>=1,同上(3)即不满足(转换为st[i]&st[i-1]==0),st[i]是第i行的状态,st[i-1]是i-1行的状态
代码:
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int mod=;
int n,m;
int st[<<],map[<<];//分别表示每一行的状态和草地的状态
int dp[][<<];
int main()
{
scanf("%d%d",&n,&m);
int x;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
scanf("%d",&x);
if(x==)map[i]=map[i]|(<<j-);
}
int k=;
for(int i=;i<=(<<m)-;i++)//计算每行合法的放置方式
{
if(!(i&(i<<)))st[++k]=i;
}
for(int i=;i<=k;i++)//特判第一行
{
if(!(st[i]&map[]))dp[][i]=;
}
for(int i=;i<=n;i++) //列举每一行(除了第一行)
{
for(int j=;j<=k;j++) //每行可能情况
{
if(!(map[i]&st[j])) //符合土地肥沃贫瘠
for(int r=;r<=k;r++) //i-1行的情况
{
if(!(map[i-]&st[r])) // i-1行r状态符合土地肥沃贫瘠
{
if(!(st[j]&st[r])) // i行j状态和i-1行r状态是否相邻
dp[i][j]+=dp[i-][r]; //加方案数量
}
}
}
}
int ans=;
for(int i=;i<=k;i++) {
ans=(ans+dp[n][i])%mod; //答案??
}
printf("%d",ans);
return ;
}
总结:确定状态,从一维转向二维……(做多了就有经验,from_Mr.Li)
C++ 洛谷 P1879 [USACO06NOV]玉米田Corn Fields的更多相关文章
- 洛谷P1879 [USACO06NOV]玉米田Corn Fields(状压dp)
洛谷P1879 [USACO06NOV]玉米田Corn Fields \(f[i][j]\) 表示前 \(i\) 行且第 \(i\) 行状态为 \(j\) 的方案总数.\(j\) 的大小为 \(0 \ ...
- 洛谷 P1879 [USACO06NOV]玉米田Corn Fields 题解
P1879 [USACO06NOV]玉米田Corn Fields 题目描述 Farmer John has purchased a lush new rectangular pasture compo ...
- 洛谷P1879 [USACO06NOV]玉米田Corn Fields (状态压缩DP)
题目描述 Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1 ≤ N ...
- 洛谷P1879 [USACO06NOV]玉米田Corn Fields【状压DP】题解+AC代码
题目描述 Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1 ≤ N ...
- 洛谷 P1879 [USACO06NOV]玉米田Corn Fields
题目描述 Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1 ≤ N ...
- [洛谷P1879][USACO06NOV]玉米田Corn Fields
题目大意:有一个$n\times m$的矩阵,$(1 \leq m \leq 12; 1 \leq n \leq 12)$,想在其中的一些格子中种草,一些格子不能种草,且两块草地不相邻.问有多少种种植 ...
- 【洛谷P1879】玉米田Corn Fields
玉米田Corn Fields 题目链接 此题和互不侵犯状压DP的做法类似 f[i][j]表示前i行,第i行种植(1)/不种植(0)构成的二进制数为j时的方案数 首先我们可以预处理出所有一行中没有两个相 ...
- 洛谷 P1879 [USACO06NOV]玉米田 解题报告
P1879 [USACO06NOV]玉米田Corn Fields 题目描述 农场主\(John\)新买了一块长方形的新牧场,这块牧场被划分成\(M\)行\(N\)列\((1 ≤ M ≤ 12; 1 ≤ ...
- P1879 [USACO06NOV]玉米田Corn Fields(状压dp)
P1879 [USACO06NOV]玉米田Corn Fields 状压dp水题 看到$n,m<=12$,肯定是状压鸭 先筛去所有不合法状态,蓝后用可行的状态跑一次dp就ok了 #include& ...
随机推荐
- WinRAR 5.50 简体中文正式版发布(20多项改进)
感谢ikimi的投递 流行好用的压缩工具,支持鼠标拖放及外壳扩展,完美支持 ZIP 档案,内置程序可以解开 CAB.ARJ.LZH.TAR.GZ.ACE.UUE.BZ2.JAR.ISO 等多种类型的压 ...
- BZOJ 3594 Scoi2014 方波波麦田 树阵
标题效果:给定一个序列,能够选择k次每个部分的数量和在范围内+1,寻求操作后LIS最大值 我的做法是不是一个标准的解决方案. ..5E为什么跑飞的复杂性. . . 首先,显而易见的结论是,我们选择k右 ...
- 如何自定义WPF项目的Main函数
原文:如何自定义WPF项目的Main函数 与Winform项目不同,WPF项目的Main函数在项目生成的时候,系统自动在后台为我们生成.根据项目生成方式的不同,其文件位于obj/Debug/App.g ...
- 数据在数组中存储的顺序:小端 OR 大端模式 详解
大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放: 小端模式,是指数据的高 ...
- WPF 资源(StaticResource 静态资源、DynamicResource 动态资源、添加二进制资源、绑定资源树)
原文:WPF 资源(StaticResource 静态资源.DynamicResource 动态资源.添加二进制资源.绑定资源树) 一.WPF对象级(Window对象)资源的定义与查找 实例一: St ...
- <转>C# 动态创建DataTable
C# 动态创建DataTable,有时候在做些测试Demo中用来模拟一些数据比较不错.记在这里避免以后重写呵呵... DataTable dt = new DataTable(); dt.Column ...
- 【Git】整合分支那些事儿
对于scm这个岗位来说,基线升级应该是这个岗位需要的必备技能了,现在来说说我司进行高通代码基线升级时选择的方式方法,供大家参考,也供自己学习积累. git这个工具大家都并不陌生,但是对于不经常提交代码 ...
- Android 命令设置获取、IP地址、网关、dns
设置ip root@android:/ # ifconfig eth0 192.168.0.173 netmask 255.255.255.0 ifconfig eth0 192.168.0.173 ...
- Win10版《芒果TV》全平台直播第89届奥斯卡颁奖典礼,特设第二演播室带来一手资讯
芒果TV为所有中国影迷们带来的:今年的奥斯卡直播与往年格外不同,为了让网友们观看这场盛典得到多维度体验,不管是来看热闹的还是看门道的都看得开心尽兴,芒果TV特设第二演播室,为大家带来第一手新鲜热辣的现 ...
- 什么是OTC?
OTC(Over The Counter)非处方药物,我国卫生部医政司是这样定义的:它是消费者可不经过医生处方,直接从药房或药店购买的药品,而且是不在医疗专业人员指导下就能安全使用的药品,即不需要凭借 ...