炮兵阵地 (状态dp)
来源:互联网 发布:js regexp 编辑:程序博客网 时间:2024/06/11 08:11
司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队。一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P"表示),如下图。在每一格平原地形上最多可以布置一支炮兵部队(山地上不能够部署炮兵部队);一支炮兵部队在地图上的攻击范围如图中黑色区域所示:
如果在地图中的灰色所标识的平原上部署一支炮兵部队,则图中的黑色的网格表示它能够攻击到的区域:沿横向左右各两格,沿纵向上下各两格。图上其它白色网格均攻击不到。从图上可见炮兵的攻击范围不受地形的影响。
现在,将军们规划如何部署炮兵部队,在防止误伤的前提下(保证任何两支炮兵部队之间不能互相攻击,即任何一支炮兵部队都不在其他支炮兵部队的攻击范围内),在整个地图区域内最多能够摆放多少我军的炮兵部队。
第一行包含两个由空格分割开的正整数,分别表示N和M;
接下来的N行,每一行含有连续的M个字符('P'或者'H'),中间没有空格。按顺序表示地图中每一行的数据。N <= 100;M <= 10。
接下来的N行,每一行含有连续的M个字符('P'或者'H'),中间没有空格。按顺序表示地图中每一行的数据。N <= 100;M <= 10。
仅一行,包含一个整数K,表示最多能摆放的炮兵部队的数量。
5 4PHPPPPHHPPPPPHPPPHHP
6
题目大概:
在一个n*m的矩形里,可以放置炮台,一个炮台攻击距离为2,炮台不能在彼此攻击距离内,问可放炮台的最大数量。
思路:
每一行的状态为10。可以把一行压缩成一个数。
dp【i】【j】【k】表示到第 i 行,前一行状态为j,本行状态为k的炮台数量。
代码里有注释
代码:
#include <iostream>#include <cstdio>#include <cstring>using namespace std;int dp[110][60][60];int st[60],sum[60],col[100];int cnt;char s[10];int getsum(int x)//计算一行的炮台数量,就是计算1的数量{ int ans=0; while(x) { if(x&1)ans++; x>>=1; } return ans;}int pan(int x)//判断一行状态是否合法{ if(x&(x<<1))return 0; if(x&(x<<2))return 0; return 1;}void yu(int m){ int e=1<<m; cnt=0; for(int i=0;i<e;i++)//枚举本行每个状态 { if(pan(i))//判断给状态两个炮台间隔是否为2 { st[cnt]=i;sum[cnt++]=getsum(i);//把合法状态存储,并计算出给状态的炮台数量 } }}void clear(int x)//初始化{ for(int i=0;i<cnt;i++) for(int j=0;j<cnt;j++) dp[x][i][j]=-1;}int main(){ int n,m; while(~scanf("%d%d",&n,&m)) { yu(m);//预处理 memset(col,0,sizeof(col)); for(int i=0;i<n;i++) { scanf("%s",s); for(int j=0;j<m;j++) { if(s[j]=='H')col[i]|=(1<<j);//存储状态 } } for(int i=0;i<n;i++)clear(i); for(int i=0;i<cnt;i++) if(!(col[0]&st[i]))dp[0][0][i]=sum[i]; for(int i=1;i<n;i++)//枚举所有行 { for(int j=0;j<cnt;j++)//枚举本行状态 { if(!(col[i]&st[j]))//判断是否合法 for(int r1=0;r1<cnt;r1++)//枚举前一行状态 { if(!(st[j]&st[r1]))//判断 for(int r2=0;r2<cnt;r2++)//枚举前两行状态 { if(!(st[j]&st[r2]))//判断 if(dp[i-1][r2][r1]!=-1)//前一行是否更新 { dp[i][r1][j]=max(dp[i][r1][j],dp[i-1][r2][r1]+sum[j]); } } } } } int ans=0; for(int i=0;i<cnt;i++) for(int j=0;j<cnt;j++) { ans=max(ans,dp[n-1][i][j]); } printf("%d\n",ans); } return 0;}
阅读全文
0 0
- 炮兵阵地 (状态dp)
- poj1185 炮兵阵地 (DP状态压缩)
- POJ1185 炮兵阵地 (状态压缩DP)
- poj1185 炮兵阵地(状态压缩dp)
- poj1185 炮兵阵地(状态压缩dp)
- poj1185炮兵阵地(状态压缩dp)
- POJ 1185 炮兵阵地(状态dp)
- POJ1185 炮兵阵地 (状态压缩DP)
- POJ1185炮兵阵地(状态压缩DP)
- 【状态压缩DP】炮兵阵地
- POJ1185 炮兵阵地 状态DP
- 【dp-状态压缩】炮兵阵地
- poj 1185 炮兵阵地(DP-状态DP)
- poj 1185 炮兵阵地 (状态压缩dp)
- POJ1185——炮兵阵地(状态压缩DP)
- poj 1185 炮兵阵地(经典状态压缩dp)
- POJ 1185 炮兵阵地 (状态压缩dp)
- 状态压缩DP-炮兵阵地(POJ 1185)
- Jdk1.8 HashMap解读
- 拦截器+OkHttp封装 Recyclerview
- Ruby中的require、load以及include
- 2017年12月10日训练笔记
- 树链剖分简介(BZOJ1036)(洛谷2590)
- 炮兵阵地 (状态dp)
- Leetcode | Repeated String Match
- python知识点(2)——python基础 流程控制
- 51Nod 2020 排序相减
- Spark中存在的各种2G限制
- java定时任务调度Timer
- TCP/IP理论基础
- JAVA NIO之简介
- js代理一个函数