题目

题目描述

司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队。一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图。在每一格平原地形上最多可以布置一支炮兵部队(山地上不能够部署炮兵部队);一支炮兵部队在地图上的攻击范围如图中黑色区域所示:

如果在地图中的灰色所标识的平原上部署一支炮兵部队,则图中的黑色的网格表示它能够攻击到的区域:沿横向左右各两格,沿纵向上下各两格。图上其它白色网格均攻击不到。从图上可见炮兵的攻击范围不受地形的影响。 现在,将军们规划如何部署炮兵部队,在防止误伤的前提下(保证任何两支炮兵部队之间不能互相攻击,即任何一支炮兵部队都不在其他支炮兵部队的攻击范围内),在整个地图区域内最多能够摆放多少我军的炮兵部队。

输入输出格式

输入格式:

第一行包含两个由空格分割开的正整数,分别表示N和M;

接下来的N行,每一行含有连续的M个字符(‘P’或者‘H’),中间没有空格。按顺序表示地图中每一行的数据。N≤100;M≤10。

输出格式:

仅一行,包含一个整数K,表示最多能摆放的炮兵部队的数量。

输入输出样例

输入样例#1: 复制

5 4
PHPP
PPHH
PPPP
PHPP
PHHP

输出样例#1: 复制

6

分析

  • 首先,显然状压DP
  • 这里需要用一个数组记录下满足的数
  • 减少循环
  • 然后注意一点位运算多加括号
  • 设f[i][j][k]为当前第i行,的集合是j,第i-1行集合是k

代码

#include<iostream>
#define N 100000000
using namespace std;
int f[100001],sta[100001];
int ff[105][1500][1500];
int sum[1500];
int b[1500];
int find(int x)
{int ans=0;while (x){ans++;x-=x&(-x); }return ans;
}
int main ()
{int m,n,xx;cin>>m>>n;char x;for (int i=1;i<=m;i++)for (int j=0;j<n;j++){cin>>x;if (x=='P') xx=1; else xx=0;f[i]=(f[i]<<1)+xx;}int maxn=(1<<n)-1;int cnt=0;for (int i=0;i<=maxn;i++){if (((i&(i<<1))==0)&&((i&(i>>1))==0)&&((i&(i<<2))==0)&&((i&(i>>2))==0))b[++cnt]=i;} for (int i=0;i<=maxn;i++)sum[i]=find(i);for (int i=1;i<=n;i++)for (int j=1;j<=cnt;j++)ff[i][b[j]][0]=sum[b[j]];for (int i=2;i<=m;i++)for (int j=1;j<=cnt;j++)if ((b[j]&f[i])==b[j])for (int k=1;k<=cnt;k++)if ((b[k]&f[i-1])==b[k])for (int l=1;l<=cnt;l++)if ((b[l]&f[i-2])==b[l]){if ((b[j]&b[k])||(b[j]&b[l])||(b[k]&b[l])) continue;else  ff[i][j][k]=max(ff[i-1][k][l]+sum[j],ff[i][j][k]);}int ans=0;for (int i=0;i<=maxn;i++)for (int j=0;j<=maxn;j++)ans=max(ff[n][i][j],ans);cout<<ans;
}

转载于:https://www.cnblogs.com/zjzjzj/p/11147948.html

洛谷 P2704 [NOI2001]炮兵阵地相关推荐

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

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

  2. 洛谷P2704 [NOI2001]炮兵阵地(状压dp)

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

  3. 洛谷 P2704 炮兵阵地 题解

    洛谷 P2704 炮兵阵地 题解 洛谷 P2704 题目 司令部的将军们打算在NNNMMM的网格地图上部署他们的炮兵部队.一个NNNMMM的地图由NNN行MMM列组成,地图的每一格可能是山地(用&qu ...

  4. jzoj1768,P2704,POJ1185-[NOI2001]炮兵阵地【状态压缩dp】

    正题 POJ链接:http://poj.org/problem?id=1185 jzoj链接:https://jzoj.net/senior/#main/show/1768 洛谷评测记录:https: ...

  5. 洛谷p2704 炮兵阵地

    典型的状态压缩题,只是要定义dp[i][j][k], #include<bits/stdc++.h>using namespace std; int n,m,state[1<< ...

  6. [NOI2001]炮兵阵地

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

  7. 2022-5-20 吃月饼(something wrong), 数塔取数问题, 制铁棒, 子段统计, 炮兵阵地

    1. 吃月饼 有一块月饼,是正三角形的,又被分割成了许多块小正三角形的月饼,里面有若干块被吃掉了.现在想要在这块月饼中再找一个由小正三角形月饼的正三角形月饼,而且要求面积最大的. 样例解释: 大月饼的 ...

  8. 刷题周记(九)——#状压DP:最短Hamilton路径、小国王(互不侵犯)、玉米田(Corn Fields G)、愤怒的小鸟、吃奶酪、炮兵阵地、宝藏 #区间DP:清空字符串#DP:关灯问题II

    文章目录 --2020年12月20日(周日)------------------ 状压DP 一.最短Hamilton路径(模板题) 二.玉米田(P1879 [USACO06NOV]Corn Field ...

  9. 洛谷-题解 P2672 【推销员】

    独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...

最新文章

  1. 面试官:你知道 Docker 有哪些优缺点嘛?
  2. 打开chm文件不能显示内容的解决办法
  3. 【每周NLP论文推荐】 聊天机器人中FAQ相关的论文推荐
  4. 有三AILab成立 | 寻找合适的你
  5. vue怎么调用子元素的方法_vue.js 父组件如何触发子组件中的方法
  6. Swing企业员工工资管理系统v1.4(java毕业设计)
  7. linux-基本权限UGO-读写执行权限
  8. go 模板(template)的常用基本语法
  9. Cheat Enginee(CE)修改器详细教程
  10. 天梯 L1 Practic1 题解合集
  11. 年全国高校计算机能力挑战赛,初赛公示_2020年全国高校计算机能力挑战赛
  12. 文本搜索引擎Lucene之filed详解和代码测试
  13. python笔记-2020/09/01下午-字符串练习(2)
  14. 逻辑对计算机,对计算机模拟中的逻辑、方法论的几点认识
  15. 解决Vue启动报错 npm ERR! @1.0.0 dev: node build/dev-server.js
  16. 正则表达式判断用户昵称
  17. IT项目经理应具备的十大软技能
  18. 2016码农谷全国大学生程序设计邀请赛(测试赛)
  19. Apple Car将提前“出世”,华为、百度准备好了吗?
  20. python杂记-逆波兰表达式求解

热门文章

  1. 显示计算机程序的表格如何打开,电脑表格怎么小窗口显示不出来怎么办
  2. visual studio学习python_一步一步学Python3(小学生也适用) 第三篇: Visual Studio Code
  3. c语言程序设计运用,清华大学出版社-图书详情-《C语言程序设计及应用教程》...
  4. 阻止JavaScript事件冒泡到父元素
  5. java 文件流关闭 finally,关于java:为什么需要在“ finally”内关闭文件,而仍将其嵌入在“ try / catch”块内?...
  6. php time相差12小时_PHP服务器时间差8小时解决方案
  7. python自关联_Django之Mode的外键自关联和引用未定义的Model方法
  8. 小米笔记本服务器系统,小米笔记本Pro GTX版
  9. 我的计算机磁盘容量条不见了,高手解读Win10系统打开此电脑磁盘空间使用量指示条不见了如何处理的具体操作方式...
  10. jq 自动打开浏览器_jQuery之解析判断当前页面打开端(APP或浏览器)的方法