题意

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

于( \(\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]炮兵阵地 题解的更多相关文章

  1. 洛谷P2704 [NOI2001]炮兵阵地题解

    题目描述 司令部的将军们打算在\(N * M\)的网格地图上部署他们的炮兵部队.一个\(N * M\)的地图由N行M列组成,地图的每一格可能是山地(用\("H"\) 表示),也可能 ...

  2. [洛谷P2704] [NOI2001]炮兵阵地

    洛谷题目链接:[NOI2001]炮兵阵地 题目描述 司令部的将军们打算在NM的网格地图上部署他们的炮兵部队.一个NM的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示), ...

  3. C++ 洛谷 P2704 [NOI2001]炮兵阵地

    P2704 [NOI2001]炮兵阵地 没学状压DP的看一下 此题意思很简单,如下图,就是十字架上的不能有两个点放炮兵. 在做此题前,先做一下玉米田 玉米田题解 分析: 而m即一行的个数小于等于10, ...

  4. P2704 [NOI2001]炮兵阵地 (状压DP)

    题目: P2704 [NOI2001]炮兵阵地 解析: 和互不侵犯一样 就是多了一格 用\(f[i][j][k]\)表示第i行,上一行状态为\(j\),上上行状态为\(k\)的最多的可以放的炮兵 发现 ...

  5. 洛谷P2704 [NOI2001]炮兵阵地 [状压DP]

    题目传送门 炮兵阵地 题目描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图 ...

  6. [Poj1185][Noi2001]炮兵阵地(状压dp)

    炮兵阵地 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 29476   Accepted: 11411 Descriptio ...

  7. 【题解】洛谷P2704 [NOI2001] 炮兵阵地(状压DP)

    洛谷P2704:https://www.luogu.org/problemnew/show/P2704 思路 这道题一开始以为是什么基于状压的高端算法 没想到只是一道加了一行状态判断的状压DP而已 与 ...

  8. [NOI2001]炮兵阵地 状压DP

    题面: 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图.在每一格平原地形上最多 ...

  9. 洛谷 P2704 [NOI2001]炮兵阵地

    题意简述 给定一张地图,有山地H,平原P,平原可放置炮兵, 炮兵可以攻击沿横向左右各两格,沿纵向上下各两格的区域 求最多放几个炮兵,使他们两两攻击不到 题解思路 枚举第i层,第i - 1层,第i - ...

随机推荐

  1. Kibana对数据的可视化

    基于上一篇的操作,我们已经获得了数据,接下来我们就要处理数据,因此选用了Kibana 先来介绍一下, Kibana是一个针对Elasticsearch的开源分析及可视化平台,用来搜索.查看交互存储在E ...

  2. 夯实Java基础(四)——面向对象之多态

    1.多态介绍 面向对象三大特征:封装.继承.多态.多态是Java面向对象最核心,最难以理解的内容.从一定角度来看,封装和继承几乎都是为多态而准备的. 多态就是指程序中定义的引用变量所指向的具体类型和通 ...

  3. CODING 告诉你如何建立一个 Scrum 团队

    原文地址:https://www.atlassian.com/agile/scrum/roles 翻译君:CODING 敏杰小王子 Scrum 当中有三个角色:PO(product owner),敏捷 ...

  4. 体验使用MUI上手练习app页面开发

    因为公司安排需要先学习一点app开发,而安排学习的框架就是MUI,上手两天体验还算可以(来自后端人员的懵逼),靠着MUI的快捷键可以快速的完成自己想要的样式模板,更多的交互性的内容则需要使用js来完成 ...

  5. NLP(十五)让模型来告诉你文本中的时间

    背景介绍   在文章NLP入门(十一)从文本中提取时间 中,笔者演示了如何利用分词.词性标注的方法从文本中获取时间.当时的想法比较简单快捷,只是利用了词性标注这个功能而已,因此,在某些地方,时间的识别 ...

  6. python数据类型图解

  7. Flutter 1.7 正式版发布

    今天,我们非常高兴地向大家宣布又一个正式版本的发布 -- Flutter 1.7,这是继上次 I/O 时众多重要功能发布以来的一次小更新.Flutter 1.7 包含了对 AndroidX 的支持,满 ...

  8. 100天搞定机器学习|Day22 机器为什么能学习?

    前情回顾 机器学习100天|Day1数据预处理 100天搞定机器学习|Day2简单线性回归分析 100天搞定机器学习|Day3多元线性回归 100天搞定机器学习|Day4-6 逻辑回归 100天搞定机 ...

  9. 第一次Git使用以及码云(Gitee)

    下载安装Git,官网下载地址https://git-scm.com/downloads,我用的是Win10版,下载好后一路默认安装,安装时会给你自动添加环境变量,完成后打开cmd,输入git --ve ...

  10. python+爬虫+微信机器人 打造属于你的网购价格监督利器

    写在最前 程序是为人类服务的,最近正好身边小伙伴们在做球衣生意,当然是去nikenba专区购买了,可是有些热门球衣发布几分钟就被抢完,有些折扣球衣也是很快就被抢售一空,那么我们只能靠自己的眼睛一直盯着 ...