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& ...
随机推荐
- XMLHttpRequest 请求java部署的webservice 跨域问题
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <html> <hea ...
- Http请求格式(在Linux下使用telnet亲测,通过这篇我才明白)
命令行窗口中用telnet测试HTTP协议请求消息格式响应消息格式1. 命令行窗口中用telnet测试HTTP协议 HTTP消息是由普通ASCII文本组成.消息包括消息头和数据体部分.消息头以行为单位 ...
- debian9 安装 odoo11 笔记用 部分内容转载前辈的,在此感谢
1先创建个odoo用户 sudo adduser odoo 2:给root 权限: sudo vi /etc/sudoers 修改文件参考如下: # User privilege specificat ...
- asp .net 文件浏览功能
达到的目的是,发布站点后,在站点某个目录下的图片文件可以通过url访问 步骤 1.新建一个网站 注意,不要建立在需要较高访问权限的地方,不要建立空网站 如果是需要较高访问权限的目录,而IIS本身账号的 ...
- AngularJS table循环数据
<div ng-app="CycleTableApp" ng-controller="CycleTableContrl as vm"> <h1 ...
- comtextMenu 如何正确的响应MouseLeave事件
今天给菜单加上这个事件,发现弹出菜单后 鼠标怎么动都不会触发 mouseLeave事件 解决方法是 在菜单loaded事件中,利用visualTreeHelper 访问他内部的border控件,把这个 ...
- NULL指针区域(NULL定义为0-65535之间的任何数都可以)
NULL指针区域0x00000000-0x0000FFFF:65535字节 这个区域的作用是用来帮助程序员发现内存分配失败后未检查就使用的错误.比如使用malloc分配内存失败,返回NULL,而又未做 ...
- C#的Task、async、await关键字
Task,一个类,可以执行一个方法,构造函数需要传一个Action类型的委托,Action类型的委托是可以拥有多个参数,没有返回值的. Task<T> Task的泛型,构造函数传入一个Fu ...
- virtualbox ubuntu16.04 自动挂载共享文件夹
为了操作方便,需要ubuntu 在开机运行时自动挂载共享文件夹,ubuntu的版本是16.04,宿主机是win10,步骤如下: 1. 在virtualbox “设备”-“共享文件夹”中设置共享文件夹如 ...
- Qt 5 最小构建笔记(只编译QtBase)
只想用Qt5最基本的功能,因此只编译QtBase.也不想为了编译一个Qt装很多东西(比如非常肥的DirectX SDK) 软件清单: Visual Studio 2010 Professional w ...