状压DP初识~~炮兵阵地
Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 31718 | Accepted: 12253 |
Description

如果在地图中的灰色所标识的平原上部署一支炮兵部队,则图中的黑色的网格表示它能够攻击到的区域:沿横向左右各两格,沿纵向上下各两格。图上其它白色网格均攻击不到。从图上可见炮兵的攻击范围不受地形的影响。
现在,将军们规划如何部署炮兵部队,在防止误伤的前提下(保证任何两支炮兵部队之间不能互相攻击,即任何一支炮兵部队都不在其他支炮兵部队的攻击范围内),在整个地图区域内最多能够摆放多少我军的炮兵部队。
Input
接下来的N行,每一行含有连续的M个字符('P'或者'H'),中间没有空格。按顺序表示地图中每一行的数据。N <= 100;M <= 10。
Output
Sample Input
5 4
PHPP
PPHH
PPPP
PHPP
PHHP
Sample Output
6 题意:中文题面,题意很明显了
我们来考虑一下最暴力的搜索每个点都尝试一遍的话会是1000!
肯定是会爆炸的,所以,既然每行的列数在10以内,那么我们很自然的就想到了状态压缩的dp
将每一行的状态存储为一个二进制数,1表示可以放,0表示不能放
每一层的状态由上一层推导而来,如果上层这个地方放了,那么下面的这个地方就不能放
所以我们要用到二进制的位运算
dp[r][j][i]=max(dp[r−1][k][j]+sum[i])
其中sum[i]sum[i]为i状态对应的数量
代码如下:
(参考上海全能王博客
http://cubercsl.cn/solve/2017-summer/emplacement/
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <vector>
#include <set>
#include <map>
#include <cmath>
#include <queue>
#include <stack>
using namespace std;
const int maxn =;
const int INF = 0x3f3f3f3f;
const int mod = 1e9+;
const double eps = 1e-;
int dp[maxn][maxn][maxn];
int maze[maxn];
vector<int> v,sum;
inline bool ok(int s){
return !(s&(s<<))&&!(s&(s<<));
}
inline int getsum(int s){
int ret=;
for(;s;s>>=){
if(s&) ret++;
}
return ret;
}
void init(int m){
for(int i=;i <(<<m);i++){
if(ok(i)){
v.push_back(i);
sum.push_back(getsum(i));
}
}
}
int main(){
int n,m;
char tmp;
cin>>n>>m;
init(m);
memset(dp,0xc0,sizeof(dp));
for(int i=;i<n;i++){
for(int j=;j<m;j++){
cin>>tmp;
if(tmp=='H') maze[i]|=(<<j);
}
}
for(int i=;i<v.size();i++){
if(!(v[i]&maze[])){
dp[][][i]=sum[i];
}
}
for(int r=;r<n;r++)
for(int i=;i<v.size();i++)
if(!(v[i]&maze[r]))
for(int j=;j<v.size();j++)
if(!(v[i]&v[j]))
for(int k=;k<v.size();k++)
if(!(v[i]&v[k]))
dp[r][j][i]=max(dp[r][j][i],dp[r-][k][j]+sum[i]);
int ans=;
for(int i=;i<v.size();i++){
for(int j=;j<v.size();j++){
ans=max(ans,dp[n-][i][j]);
}
}
cout<<ans<<endl;
return ;
}
状压DP初识~~炮兵阵地的更多相关文章
- dp乱写1:状态压缩dp(状压dp)炮兵阵地
https://www.luogu.org/problem/show?pid=2704 题意: 炮兵在地图上的摆放位子只能在平地('P') 炮兵可以攻击上下左右各两格的格子: 而高原('H')上炮兵能 ...
- 状压DP之炮兵阵地
题目 原题来自:\(NOI 2001\) 司令部的将军们打算在\(N*M\) 的网格地图上部署他们的炮兵部队.一个\(N*M\)的地图由\(N\)行\(M\)列组成,地图的每一格可能是山地(用 H表示 ...
- [状压dp]POJ1185 炮兵阵地
中文题 题意不再赘述 对于中间这个“P” 根据dp的无后效性 我们只需考虑前面的 就变成了 只需考虑: 也就是状压前两行 具体与HDOJ的4539类似: 看HDOJ 4539 仅仅是共存状态的判断不同 ...
- POJ 1185 炮兵阵地(状压DP)
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 26426 Accepted: 10185 Descriptio ...
- [poj1185]炮兵阵地_状压dp
炮兵阵地 poj-1185 题目大意:给出n列m行,在其中添加炮兵,问最多能加的炮兵数. 注释:n<=100,m<=10.然后只能在平原的地方建立炮兵. 想法:第2到状压dp,++.这题显 ...
- TZOJ 4912 炮兵阵地(状压dp)
描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P" ...
- POJ P1185 炮兵阵地 【状压dp】
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 29502 Accepted: 11424 Description 司令 ...
- 洛谷P2704 [NOI2001]炮兵阵地 [状压DP]
题目传送门 炮兵阵地 题目描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图 ...
- POJ1185 炮兵阵地 —— 状压DP
题目链接:http://poj.org/problem?id=1185 炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions ...
随机推荐
- 网站title标题被改并被百度网址安全中心提醒的解决办法
国庆假日期间我们Sine安全接到众多网站站长求助网站标题被改导致在百度搜索中百度安全中心提醒被拦截,导致网站正常用户无法浏览网站被跳转到一些菠菜du博网站,而且很明显的一个特征就是在百度中搜索关键词的 ...
- loj136 (最小瓶颈路,多次询问)
题目描述 给定一个包含 n nn 个节点和 m mm 条边的图,每条边有一个权值.你的任务是回答 k kk 个询问,每个询问包含两个正整数 s ss 和 t tt 表示起点和终点,要求寻找从 s ss ...
- Spring + MySQL + Mybatis + Redis【二级缓存】执行流程分析
一级缓存基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该Session中的所有 Cache 就 ...
- 2 web服务器:固定返回值
1.老师给的思路 #tcp socket 服务端 socket = socket.socket() socket.bind() socket.listen() client_socket = sock ...
- Maven初步接触
最近随着搜资料,网上这样的字眼越来越多,我了解到这是构建项目的一种方式,于是准备简单看一下 首先粘几篇文章,作为学习的初步资料 Maven入门 http://blog.csdn.net/prstaxy ...
- C#文件重命名的代码
C#中没有重命名的方法,自己写了一个方法,来处理文件的重命名. /// <summary> /// 重命名文件夹内的所有子文件夹 /// </summary> /// < ...
- Python网络编程(线程通信、GIL、服务器模型)
什么是进程.进程的概念? 进程的概念主要有两点: 第一,进程是一个实体.每一个进程都有它自己的地址空间, 一般情况下,包括文本区域(text region).数据区域(data region)和堆栈( ...
- 解决:Unable to execute dex: GC overhead limit exceeded
转自http://blog.sina.com.cn/s/blog_6e334dc70101hnug.html Android打包时下面的错误: Unable to execute dex: GC ov ...
- web3无法安装的额解决方案-----yarn命令安装web3
凡是可以用 JavaScript 来写的应用,最终都会用 JavaScript 来写. --Atwood定律(Jeff Atwood在2007年提出) yarn命令详解 https://yarnpkg ...
- 第十五次ScrumMeeting会议
第十五次Scrum Meeting 时间:2017/12/5 地点:主201 人员:全体成员 目前工作情况 名字 完成的工作 计划工作 蔡帜 -- -- 游心 完成Scrum会议记录,更新wiki游戏 ...