POJ 1185 炮兵阵地 (状压DP,轮廓线DP)
题意:
给一个n*m的矩阵,每个格子中有'P'或者'H',分别表示平地和高原,平地可以摆放大炮,而大炮的攻击范围在4个方向都是2格(除了自身位置),攻击范围内不能有其他炮,问最多能放多少个炮?(n<=100,m<=10)
思路:
明显需要记录到最顶上的2格,所以一共需要记录2*m个格子有没有放炮,2*m<=20,这个数字还是很大的。但是由于炮的攻击范围比较大,所以能放得下的炮比较少,也就意味着状态比较少,那么只要不用枚举[0,1<<2*m)这么大的范围都是可以解决的。即使n=100且m=10,状态数仍然很小。弄个哈希模板就解决了。
//#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <map>
#include <algorithm>
#include <vector>
#include <iostream>
#define pii pair<int,int>
#define INF 0x7f3f3f3f
#define LL long long
#define ULL unsigned long long
using namespace std;
const double PI = acos(-1.0);
const int N=; struct Hash_Map{
static const int mod=; //根据状态数设计的哈希函数
static const int N=; //状态数
int head[mod]; //桶指针
int next[N]; //记录链的信息
int status[N]; //状态
int value[N]; //状态对应的DP值。
int size; //状态数
void clear(){ //每次调用都要清除哈希表中的状态
memset(head, -, sizeof(head));
size = ;
}
void insert(int st, int val){ //插入状态st的值为val
int h = st%mod;
for(int i=head[h]; i!=-; i=next[i]){
if(status[i] == st){ //这个状态已经存在,累加进去。
value[i] = max(value[i], val);
return ;
}
}
status[size]=st; value[size]=val;//找不到状态st,则插入st。
next[size]=head[h]; head[h]=size++; //新插入的元素在队头
}
}hashmap[]; char g[N][]; int cal(int n,int m)
{
int cur=, mod=<<*m-;
hashmap[].clear();
hashmap[].insert(,);
for(int i=; i<=n; i++)
{
for(int j=; j<=m; j++)
{
cur^=;
hashmap[cur].clear();
for(int k=; k<hashmap[cur^].size; k++)
{
int s=hashmap[cur^].status[k];
int v=hashmap[cur^].value[k];
int t=(s&(mod-))<<;
//cout<<"123"<<endl;
if(g[i][j]=='P') //可以放炮
{
if(s&(<<*m-)) //上2
hashmap[cur].insert(t,v);
else if(s&(<<m-)) //上1
hashmap[cur].insert(t,v);
else if(j>&&s&) //左2
hashmap[cur].insert(t,v);
else if(j>&&s&) //左1
hashmap[cur].insert(t,v);
else //可防可不放
{
hashmap[cur].insert(t,v);
hashmap[cur].insert(t+,v+);
}
}
else hashmap[cur].insert(t,v);
}
}
}
int ans=-;
for(int i=; i<hashmap[cur].size; i++)
ans=max(ans,hashmap[cur].value[i]);
return ans;
} int main()
{
//freopen("input.txt","r",stdin);
int n, m;
while(~scanf("%d%d",&n,&m))
{
for(int i=; i<=n; i++) scanf("%s",g[i]+);
printf("%d\n",cal(n,m));
}
return ;
}
AC代码
POJ 1185 炮兵阵地 (状压DP,轮廓线DP)的更多相关文章
- POJ 1185 炮兵阵地 状压dp
题目链接: http://poj.org/problem?id=1185 炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K 问题描述 司令部的将军们打算在N*M ...
- [poj 1185] 炮兵阵地 状压dp 位运算
Description 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用&quo ...
- POJ 1185炮兵阵地 (状压DP)
题目链接 POJ 1185 今天艾教留了一大堆线段树,表示做不动了,就补补前面的题.QAQ 这个题,我第一次写还是像前面HDU 2167那样写,发现这次影响第 i 行的还用i-2行那样,那以前的方法就 ...
- poj - 1185 炮兵阵地 状压DP 解题报告
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 21553 Accepted: 8363 Description ...
- POJ 1185 炮兵阵地 经典的 状态压缩dp
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 16619 Accepted: 6325 Description ...
- POJ1185 炮兵阵地 —— 状压DP
题目链接:http://poj.org/problem?id=1185 炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions ...
- POJ 1185 炮兵阵地(状压DP)
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 26426 Accepted: 10185 Descriptio ...
- POJ 1185 - 炮兵阵地 & HDU 4539 - 郑厂长系列故事——排兵布阵 - [状压DP]
印象中这道题好像我曾经肝过,但是没肝出来,现在肝出来了也挺开心的 题目链接:http://poj.org/problem?id=1185 Time Limit: 2000MS Memory Limit ...
- POJ 1185 炮兵阵地 【状压DP】
<题目链接> 题目大意: 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平 ...
- POJ 1185 炮兵阵地 (状压DP)
题目链接 题意 : 中文题不详述. 思路 :状压DP,1表示该位置放炮弹,0表示不放.dp[i][j][k],代表第 i 行的状态为k时第i-1行的状态为 j 时放置的最大炮弹数.只是注意判断的时候不 ...
随机推荐
- centos6.5安装sublime Text3破解版
安装后的效果图: 在csdn上找到了一个破解版. http://download.csdn.net/download/phpscott2/5356561 安装后,能够运行,但每次打开都提示没有安装py ...
- 2、R-reshape2-melt
1.melt: 短数据转长数据 (1).融合的数据为数组.表以及矩阵,melt的表达式为: melt(data, varnames = names(dimnames(data)), . ...
- day11会话管理
会话管理入门 2.1 生活中会话 我: 小张,你会跳小苹果码? 小张: 会,怎么了? 我: 公司年会上要表演节目,你教教我把 小张:没问题,一顿饭而已. 我: OK. ........ 在这次生活中的 ...
- 33.Docker安装Mysql及用户配置
mysql在官方上有两个镜像 这个是一个优化过的mysql 使用这个命令 安装mysql 演示最简单的方式去安装mysql: 这种方式安装的用户名没有,密码没有 docker run -d -p 33 ...
- Working Experience - WPF 中 DataGrid 控件的应用
问题: 添加控件后, 编辑单元格会出现异常 绑定 ItemsSource 属性后, 更新绑定对象的数据, UI 不刷新 如何显示控件中 ComboBox 类型 解决方法: 绑定 ItemsSource ...
- (转)机器学习——深度学习(Deep Learning)
from:http://blog.csdn.net/abcjennifer/article/details/7826917 Deep Learning是机器学习中一个非常接近AI的领域,其动机在于建立 ...
- UOJ #32. 【UR #2】跳蚤公路【Floydbellman-ford】
首先看这个范围很夸张但是其实有限制的也就在1e18*n范围里(走完一圈的边权),然后限制一定是有负环 用Floyd传递闭包,然后设f[i][j][k]为从1走了i步到j并且有k个x的最短路,用B-F处 ...
- Python学习笔记(字典)
今天学习一个python中的基本类型--字典(dictionary) 字典这种数据结构有点像我们平常用的通讯录,有一个名字和这个名字对应的信息.在字典中,名字叫做“键”,对应的内容信息叫做“值”.字典 ...
- Luogu P1558 色板游戏【线段树/状态压缩】By cellur925
题目传送门 今天非常想再看一遍霸王别姬想不进去题于是开始刷数据结构 注意到至多只有\(30\)种颜色,啊啊啊啊我一开始竟然想的不是状态压缩而是在线段树中存一个30大小的数组,这样每次更新的时候暴力循环 ...
- Python列表与元组
一.列表 1.列表的介绍: 列表lst = [ ] 是python的基本数据类型之一,其他编程语言也有类似的数据类型,比如JS中的数组,java中的数组等等,它是以[]括起来,每个元素用逗号隔开 ...