[POJ 1185]炮兵阵地(状压DP)
来源:互联网 发布:手机字体放大软件 编辑:程序博客网 时间:2024/05/17 08:24
Description
司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队。一个N*M的地图由N行M列组成,地图的每一格可能是山地(用”H” 表示),也可能是平原(用”P”表示),如下图。在每一格平原地形上最多可以布置一支炮兵部队(山地上不能够部署炮兵部队);一支炮兵部队在地图上的攻击范围如图中黑色区域所示:
如果在地图中的灰色所标识的平原上部署一支炮兵部队,则图中的黑色的网格表示它能够攻击到的区域:沿横向左右各两格,沿纵向上下各两格。图上其它白色网格均攻击不到。从图上可见炮兵的攻击范围不受地形的影响。
现在,将军们规划如何部署炮兵部队,在防止误伤的前提下(保证任何两支炮兵部队之间不能互相攻击,即任何一支炮兵部队都不在其他支炮兵部队的攻击范围内),在整个地图区域内最多能够摆放多少我军的炮兵部队。
Input
第一行包含两个由空格分割开的正整数,分别表示N和M;
接下来的N行,每一行含有连续的M个字符(‘P’或者’H’),中间没有空格。按顺序表示地图中每一行的数据。N <= 100;M <= 10。
Output
仅一行,包含一个整数K,表示最多能摆放的炮兵部队的数量。
Sample Input
5 4
PHPP
PPHH
PPPP
PHPP
PHHP
Sample Output
6
Solution
感觉和上一题有点像
三维的状压DP,用了滚动数组
f[i][j][k] i表示所在行 j表示当前行状态 k表示前一行状态
预处理出一行中不会造成互相攻击的状态和每个状态所含的1(炮兵部队)
#include<iostream>#include<cstring>#include<cstdio>#include<string>#define Max(a,b) (a>b?a:b)using namespace std;int n,m,f[2][1050][1050],map[100],state[1050],num[1050],cnt;int count(int x){ int y=0; while(x) { if(x&1)y++; x>>=1; } return y;}void init(){ memset(map,0,sizeof(map)); memset(f,0,sizeof(f)); cnt=0; for(int i=0;i<=(1<<m);i++) { bool b=0; if(i&(i<<1))b=1; if(i&(i<<2))b=1; if(!b) { state[++cnt]=i; num[cnt]=count(i); } }}int main(){ while(~scanf("%d%d",&n,&m)) { init(); for(int i=1;i<=n;i++) { char c[15]; cin>>c; for(int j=0;j<m;j++) { map[i]<<=1; if(c[j]=='P')map[i]+=1; } } int ans=0,cur=0; for(int i=1;i<=n;i++) { cur^=1; for(int j=1;j<=cnt;j++) { if((state[j]&map[i])!=state[j])continue; if(i==1) { f[cur][j][1]=num[j]; ans=Max(ans,f[cur][j][1]); } else for(int k=1;k<=cnt;k++) { if(state[k]&state[j])continue; if(i==2) { f[cur][j][k]=Max(f[cur][j][k],f[cur^1][k][1]+num[j]); ans=Max(ans,f[cur][j][k]); } else for(int l=1;l<=cnt;l++) { if(state[l]&state[k])continue; if(state[l]&state[j])continue; f[cur][j][k]=Max(f[cur^1][k][l]+num[j],f[cur][j][k]); ans=Max(ans,f[cur][j][k]); } } } } printf("%d\n",ans); } return 0;}
0 0
- POJ 1185--炮兵阵地(状压dp)
- POJ 1185 炮兵阵地(状压dp)
- POJ 1185 炮兵阵地(状压DP)
- POJ 1185 炮兵阵地(状压dp)
- poj 1185 炮兵阵地(状压DP)
- poj 1185 炮兵阵地(状压dp)
- 【POJ 1185】炮兵阵地(状压DP)
- poj 1185 炮兵阵地(状压dp)
- [POJ 1185]炮兵阵地(状压DP)
- POJ-1185-炮兵阵地(状压DP)
- POJ 1185 炮兵阵地(状压DP)
- poj 1185 炮兵阵地 状压DP
- POJ 1185 炮兵阵地 (状压DP)
- 炮兵阵地 - POJ 1185 状压dp
- poj 1185 炮兵阵地 状压DP
- POJ 1185-炮兵阵地(状压DP)
- POJ 1185 炮兵阵地 (状压DP)
- poj 1185 炮兵阵地 状压dp
- PHP-无限分类-下拉列表实现
- 【zabbix教程三】——centos7 安装zabbix客户端并监控
- Lesson28 No parking
- OptiTrack 推主动 VR 追踪方案,成本大降 40%,VR 主题公园的春天要来了?
- 计算机网络第二节课总结
- [POJ 1185]炮兵阵地(状压DP)
- 文章标题
- 常见几种导致内存泄露的不良写法
- 练习系统 实验二 字符串判等
- Lighthouse 激光定位技术开源了,但不是 Valve 做的
- 创建守护进程fork一次与fork两次的区别
- jdk和tomcat配置
- Android 混淆配置
- Lesson29 Taxi!