[NOI2001]炮兵阵地 题解
题意

我们先来了解一下基本的位运算

于( \(\bigwedge\) ),或 (\(\bigvee\) ) 异或(\(\bigoplus\))
在下面我们用(&)代表于,(|)代表或
一道状压dp题,状压真的太难了,这道题搞了比较久才弄懂,首先这道题我们是怎么想到状压dp的呢?首先看范围m<=10,数据范围m很小,地图上部分为山地,部分为平原,且放置了的地方左右各两格,上下各两格不能放置,就只存在两种状态,能放与不能放,就可以看为二进制的0 1我们可以对每一行进行状压,但是我们可以发现我们放置第i行时的状态是会影响到第i-1行和第i-2行的,那么我们可以算一下时间复杂度O( 1024^3*100 ) 明显过不去,那么怎么办呢?我们可以仅考虑当前行的合法状态,于前后行无关,故可以先预处理出状态出来,处理出来只有不到70种
我们可以定义状态
f[i][j][k]表示第i行状态为k且上一行状态为j的最大方案数
状态转移方程
dp[i+1][k][l]=max(dp[i+1][k][l],dp[i][j][k]+sum[l]) (sum[l]表示状态为l中1的个数)
1.判断是否为山丘
在输入时将山丘设为1,平原设为0,那么判断状态是否合法就是直接将状态st[i]&dat[1]若为1则说明则说明放在山丘上了
2.判断每个状态有没有两个炮兵左右距离在两格之内
这个可以画个图便可知道当
if(!(i&(i<<1)) && !(i&(i<<2)))
返回值为真时就可以放置,也就是说 i&(i<<1)&&i&(i<<2)返回值为0
3.每一列前两行有没有炮兵 i&j,i&k 若不为0则冲突(j为i前一行,k为j前一行)
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=110;
int n,m,dp[maxn][maxn][maxn],dat[maxn],sum[maxn],st[maxn],tot,ans;
int clu(int x){
int tmp=0;
while(x){
tmp+=(x&1);
x>>=1;
}
return tmp;
}
int main(){
scanf("%d %d",&n,&m);
for(int i=1;i<=n;++i){
for(int j=0;j<m;++j){
char ch=getchar();
while(ch!='P'&&ch!='H') ch=getchar();
if(ch=='H') dat[i]|=(1<<j);
}
}
for(int i=0;i<(1<<m);++i){
if(!(i&i<<1)&&!(i&i<<2)){
st[++tot]=i;
sum[tot]=clu(i);
}
}
for(int i=1;i<=tot;++i){
if(!(st[i]&dat[1])) dp[1][1][i]=sum[i];
}
for(int i=1;i<n;++i){
for(int j=1;j<=tot;++j){
for(int k=1;k<=tot;++k){
if(!(st[j]&st[k])&&dp[i][j][k]){
for(int l=1;l<=tot;++l){
if(!(st[l]&st[j])&&!(st[l]&st[k])&&!(st[l]&dat[i+1])){
dp[i+1][k][l]=max(dp[i+1][k][l],dp[i][j][k]+sum[l]);
}
}
}
}
}
}
for(int i=1;i<=tot;++i){
for(int j=1;j<=tot;++j){
ans=max(ans,dp[n][i][j]);
}
}
printf("%d",ans);
return 0;
}
[NOI2001]炮兵阵地 题解的更多相关文章
- 洛谷P2704 [NOI2001]炮兵阵地题解
题目描述 司令部的将军们打算在\(N * M\)的网格地图上部署他们的炮兵部队.一个\(N * M\)的地图由N行M列组成,地图的每一格可能是山地(用\("H"\) 表示),也可能 ...
- [洛谷P2704] [NOI2001]炮兵阵地
洛谷题目链接:[NOI2001]炮兵阵地 题目描述 司令部的将军们打算在NM的网格地图上部署他们的炮兵部队.一个NM的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示), ...
- C++ 洛谷 P2704 [NOI2001]炮兵阵地
P2704 [NOI2001]炮兵阵地 没学状压DP的看一下 此题意思很简单,如下图,就是十字架上的不能有两个点放炮兵. 在做此题前,先做一下玉米田 玉米田题解 分析: 而m即一行的个数小于等于10, ...
- P2704 [NOI2001]炮兵阵地 (状压DP)
题目: P2704 [NOI2001]炮兵阵地 解析: 和互不侵犯一样 就是多了一格 用\(f[i][j][k]\)表示第i行,上一行状态为\(j\),上上行状态为\(k\)的最多的可以放的炮兵 发现 ...
- 洛谷P2704 [NOI2001]炮兵阵地 [状压DP]
题目传送门 炮兵阵地 题目描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图 ...
- [Poj1185][Noi2001]炮兵阵地(状压dp)
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 29476 Accepted: 11411 Descriptio ...
- 【题解】洛谷P2704 [NOI2001] 炮兵阵地(状压DP)
洛谷P2704:https://www.luogu.org/problemnew/show/P2704 思路 这道题一开始以为是什么基于状压的高端算法 没想到只是一道加了一行状态判断的状压DP而已 与 ...
- [NOI2001]炮兵阵地 状压DP
题面: 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图.在每一格平原地形上最多 ...
- 洛谷 P2704 [NOI2001]炮兵阵地
题意简述 给定一张地图,有山地H,平原P,平原可放置炮兵, 炮兵可以攻击沿横向左右各两格,沿纵向上下各两格的区域 求最多放几个炮兵,使他们两两攻击不到 题解思路 枚举第i层,第i - 1层,第i - ...
随机推荐
- 详解 Diff 算法以及循环要加 key 值问题
上一篇文章我简述了什么是 Virtual DOM,这一章我会详细讲 Diff 算法以及为什么在 React 和 Vue 中循环都需要 key 值. 什么是 DOM Diff 算法 Web 界面其实就是 ...
- Dubbo里面线程池的拒绝策略
Dubbo里面线程池的拒绝策略 public class AbortPolicyWithReport extends ThreadPoolExecutor.AbortPolicy { protecte ...
- ubuntu安装伪分布式Hadoop3.1.2
作业要求:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/3223 本文是基于已经安装好的ubuntu环境上搭建伪分布式hadoop,在 ...
- Pandas 库之 DataFrame
How to use DataFrame ? 简介 创建 DataFrame 查看与筛选数据:行列选取 DataFrame 数据操作:增删改 一.About DataFrame DataFrame 是 ...
- Assign the task HDU - 3974 (dfs序 + 线段树)
有一家公司有N个员工(从1到N),公司里每个员工都有一个直接的老板(除了整个公司的领导).如果你是某人的直接老板,那个人就是你的下属,他的所有下属也都是你的下属.如果你是没有人的老板,那么你就没有下属 ...
- 剑指offer-链表
1. 链表中环的入口节点 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. 思路一:用哈希表存已经遍历过的节点,O(1)复杂度查找,如果再次遇到就是环入口 # -*- cod ...
- API开发之接口安全(二)-----sign校验
上一章 我们说了 sign的生成 那么 我们如何确定这个sign的准确性呢 下来 我们说说 校验sign的那些事 在拿到header里面的内容之后 我们首先需要对其内容的基本参数做一个校验 我们补充下 ...
- Spring源码剖析5:JDK和cglib动态代理原理详解
AOP的基础是Java动态代理,了解和使用两种动态代理能让我们更好地理解 AOP,在讲解AOP之前,让我们先来看看Java动态代理的使用方式以及底层实现原理. 转自https://www.jiansh ...
- 12.源码分析—如何为SOFARPC写一个序列化?
SOFARPC源码解析系列: 1. 源码分析---SOFARPC可扩展的机制SPI 2. 源码分析---SOFARPC客户端服务引用 3. 源码分析---SOFARPC客户端服务调用 4. 源码分析- ...
- 启xin宝app的token算法破解——token分析篇(三)
前两篇文章分析该APP的抓包.的逆向: 启xin宝app的token算法破解--抓包分析篇(一) 启xin宝app的token算法破解--逆向篇(二) 本篇就将对token静态分析,其实很简单就可以搞 ...