【题解】洛谷P2704 [NOI2001] 炮兵阵地(状压DP)
洛谷P2704:https://www.luogu.org/problemnew/show/P2704
思路
这道题一开始以为是什么基于状压的高端算法
没想到只是一道加了一行状态判断的状压DP而已
与普通状压并无多大区别
详细见代码
代码
#include<iostream>
using namespace std;
#define maxn 1010
int f[][maxn][maxn],num[maxn],st[maxn],map[];
int n,m,ans,state;
int get(int x)//计算每行1的个数
{
int t=;
while(x>)
{
++t;
x-=x&(-x);//减去lowbit 就是最后一个1
}
return t;
}
int main()
{
cin>>n>>m;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
char x;
cin>>x;
if(x=='H')//如果是山地就是1
map[i]=(map[i]<<)+;
if(x=='P')//如果是平原就是0
map[i]=(map[i]<<);
}
for(int i=;i<=(<<m)-;i++)//枚举所有状态查找可用状态
if(!(i&(i<<))&&!(i&(i<<))&&!(i&(i>>))&&!(i&(i>>)))//判断此行可用
{
st[++state]=i;//记录状态
num[state]=get(i);//计算1的个数
if(!(i&map[])) f[][][state]=num[state];//初始化第一行 如果不与地形冲突
}
for(int i=;i<=state;i++)//初始化第二行
for(int j=;j<=state;j++)
if(!(st[i]&st[j])&&!(st[j]&map[])) //如果第二行和第一行和地形都不冲突
f[][i][j]=max(f[][i][j],f[][][i]+num[j]);
for(int i=;i<=n;i++)//从第三行开始枚举
for(int j=;j<=state;j++)//枚举此行状态
if(!(map[i]&st[j]))//判断是否和地形冲突
{
for(int k=;k<=state;k++)//枚举上一行状态
if(!(st[j]&st[k]))//上一行不与此行冲突
{
for(int t=;t<=state;t++)//枚举上上行状态
if(!(st[t]&st[k])&&!(st[t]&st[j]))//上上行不与上一行和此行冲突
f[i][k][j]=max(f[i][k][j],f[i-][t][k]+num[j]);//记录
}
}
for(int i=;i<=state;i++)//枚举最后两行的所有状态
for(int j=;j<=state;j++)
ans=max(ans,f[n][i][j]);//取最大值
cout<<ans;
}
【题解】洛谷P2704 [NOI2001] 炮兵阵地(状压DP)的更多相关文章
- 洛谷P2704 [NOI2001]炮兵阵地 [状压DP]
题目传送门 炮兵阵地 题目描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图 ...
- P2704 [NOI2001]炮兵阵地 (状压DP)
题目: P2704 [NOI2001]炮兵阵地 解析: 和互不侵犯一样 就是多了一格 用\(f[i][j][k]\)表示第i行,上一行状态为\(j\),上上行状态为\(k\)的最多的可以放的炮兵 发现 ...
- C++ 洛谷 P2704 [NOI2001]炮兵阵地
P2704 [NOI2001]炮兵阵地 没学状压DP的看一下 此题意思很简单,如下图,就是十字架上的不能有两个点放炮兵. 在做此题前,先做一下玉米田 玉米田题解 分析: 而m即一行的个数小于等于10, ...
- 洛谷P2704 [NOI2001]炮兵阵地题解
题目描述 司令部的将军们打算在\(N * M\)的网格地图上部署他们的炮兵部队.一个\(N * M\)的地图由N行M列组成,地图的每一格可能是山地(用\("H"\) 表示),也可能 ...
- [洛谷P2704] [NOI2001]炮兵阵地
洛谷题目链接:[NOI2001]炮兵阵地 题目描述 司令部的将军们打算在NM的网格地图上部署他们的炮兵部队.一个NM的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示), ...
- 洛谷 P2704 [NOI2001]炮兵阵地 (状态压缩DP+优化)
题目描述 司令部的将军们打算在NM的网格地图上部署他们的炮兵部队.一个NM的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P" ...
- [NOI2001]炮兵阵地 状压DP
题面: 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图.在每一格平原地形上最多 ...
- [POJ1185][NOI2001]炮兵阵地 状压DP
题目链接:http://poj.org/problem?id=1185 很裸的状压,考虑对于一行用二进制储存每一种的状态,但是状态太多了做不了. 观察到有很多状态都是不合法的,于是我们预处理出合法的状 ...
- 洛谷 P2704 [NOI2001]炮兵阵地
题意简述 给定一张地图,有山地H,平原P,平原可放置炮兵, 炮兵可以攻击沿横向左右各两格,沿纵向上下各两格的区域 求最多放几个炮兵,使他们两两攻击不到 题解思路 枚举第i层,第i - 1层,第i - ...
随机推荐
- php explode时间分割
<?php $str = "2017-02-27 13:40:42"; $first=explode(' ',$str); $second=explode('-', $fir ...
- Codeforces183D T-shirt
传送门 这题好神啊……(然而我连每种物品贡献独立都没看出来…… 首先$O(n^2 m)$的DP肯定都会写,然后可以发现每种物品一定是选得越多再选一个的收益就越低,因此可以用一个堆维护当前收益最高的物品 ...
- 原生js操作DOM基础-笔记
原文参考http://mp.weixin.qq.com/s?__biz=MzU3MDA0NTMzMA==&mid=2247485490&idx=1&sn=15197b4b53e ...
- JavaScript This -笔记
参考文章:blog.crimx.com/2016/05/12/understanding-this/ 在es6箭头函数之前this是执行时候确定的,而非定义时候确定.函数都是被调用的,调用时找前面调用 ...
- CentOS使用fdisk扩展磁盘空间
使用情况: 1. 虚拟机配置150G硬盘,初始化为/dev/sdb1,后因为磁盘空间不够使用,动态扩容至300G,扩容完成后,想要动态扩容/dev/sdb1分区. 2. 磁盘空间300G,之前分区只划 ...
- 浅谈回归(二)——Regression 之历史错误翻译
我很好奇这个问题,于是搜了一下.我发现 Regression 这个词 本意里有"衰退"的意思. 词根词缀: re- 回 , 向后 + -gress- 步 , 级 + -ion 名词 ...
- idea 使用 git打成jar包到 nexus
1.使用idea生成jar包参考:http://blog.csdn.net/eastgrand/article/details/11945309 2.进入到 自己的工程目录(含有pom.xml的目录) ...
- gradle中文学习资料
http://wiki.jikexueyuan.com/project/GradleUserGuide-Wiki/ https://www.gitbook.com/book/lippiouyang/g ...
- SQL Server ->> Computed Column(计算列)
Computed Column(计算列)是自SQL Server 2005开始就有的特性.计算列的定义是一个表达式.表达式可以是非计算列,常量,函数间的组合.但是不可以是子查询. 计算列数据固化 默认 ...
- SQL Server ->> WITH RESULT SETS子句
SQL Server 2012对EXECUTE子句引入了WITH RESULT SETS选项,用于对EXECUTE语句执行的存储过程或者动态语句结果进行一个指定数据类型的转换,这样可以避免一种情况就是 ...