状压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 ...
随机推荐
- WHERE条件中or与union引起的全表扫描的问题
说起数据库的SQL语句执行效率的问题,就不得不提where条件语句中的or(逻辑或)引起的全表扫描问题,从而导致效率下降. 在以往绝大多数的资料中,大多数人的建议是使用 union 代替 or ,以解 ...
- (数据科学学习手札30)朴素贝叶斯分类器的原理详解&Python与R实现
一.简介 要介绍朴素贝叶斯(naive bayes)分类器,就不得不先介绍贝叶斯决策论的相关理论: 贝叶斯决策论(bayesian decision theory)是概率框架下实施决策的基本方法.对分 ...
- 20145202马超 2016-2017-2 《Java程序设计》第一次实验
之前做的(http://www.cnblogs.com/tuolemi/p/5707098.html) 其余的 断点的使用 行断点 条件断点 参考(http://www.cnblogs.com/roc ...
- DSP28335的XINTF操作SRAM实验
1. 本次使用三兄弟的XDS28335开发板,研究一下XINTF操作SRAM的代码.哈弗结构,奇怪,DSP28335是哈弗结构,那么数据和程序空间应该独立的,为啥书上说采用统一的寻址方式?估计只是读写 ...
- loj2587 「APIO2018」铁人两项
圆方树orz,参见猫的课件(apio和wc的)以及这里那里 #include <iostream> #include <cstdio> using namespace std; ...
- 代码混淆 iOS
该方法只能针对有.m.h的类进行混淆,静态库等只有.h文件的没法进行混淆 代码混淆,刚刚看到是不是有点懵逼,反正我是最近才接触到这么个东西,因为之前对于代码和APP,只需要实现功能就好了,根本没有考虑 ...
- CSS里一个奇怪的属性
事情是这样的,在一个手机界面的制作中,我发现按钮点击后总会出现一个边框,于是开始搜索解决方案.搜到的解决方案是这样的. a:focus,input:focus{ -webkit-tap-highlig ...
- python发起请求提示UnicodeEncodeError
具体错误: UnicodeEncodeError: 'latin-1' codec can't encode characters in position 73-74: Body ('测试') is ...
- 11-Mysql数据库----单表查询
本节重点: 单表查询 语法: 一.单表查询的语法 SELECT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field ...
- 问题 A: a+b
问题 A: a+b 时间限制: 1 Sec 内存限制: 32 MB提交: 285 解决: 124[提交][状态][讨论版][命题人:外部导入] 题目描述 实现一个加法器,使其能够输出a+b的值. ...