炮兵阵地
Time Limit: 2000MS   Memory Limit: 65536K
Total Submissions: 27926   Accepted: 10805

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

Source

题意:给你一个m*n的矩阵 每一块 P代表平原 可以安放炮台 现在按照要求部署炮台 任意两个炮台之间的距离应当大于2 问最多能够安放多少个炮台
题解:dp[i][j][l]  代表第i行部署状态为l 第i-1行部署状态位j的情况下的答案
 #include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<map>
#include<queue>
#include<stack>
#include<vector>
#include<set>
#define ll __int64
#define mod 100000000
using namespace std;
int n,m;
int a[];
int b[];
int dp[][][];
char w[][];
int cnt=;
int bit[];
int fin (int x)
{
int jishu=;
while(x>)
{
if(x%==)
jishu++;
x/=;
}
return jishu;
}
bool check(int x)//判断每一行可行的部署方案
{
if(x&(x/)) return false;
if(x&(x/)) return false;
return true;
}
bool fun(int x,int k)//判断是否满足平原的要求
{
if(x&b[k]) return false;
else return true;
}
int main()
{
scanf("%d %d",&m,&n);
char exm;
cnt=;
for(int i=; i<(<<n); i++){
if(check(i)){
a[++cnt]=i;
bit[cnt]=fin(i);
}
}
memset(b,,sizeof(b));
for(int i=; i<=m; i++)
scanf("%s",w[i]+);
for(int i=; i<=m; i++)
for(int j=; j<=n; j++)
if(w[i][j]=='H')
b[i]+=(<<(n-j));
memset(dp,-,sizeof(dp));
for(int i=; i<=cnt; i++){
if(fun(a[i],))
dp[][][i]=bit[i];
} for(int i=; i<=m; i++){
for(int k=; k<=cnt; k++){
if(!fun(a[k],i)) continue;
for(int j=; j<=cnt; j++){
if(a[k]&a[j]) continue;
for(int l=;l<=cnt;l++){
if(a[k]&a[l]) continue;
if(dp[i-][j][l]==-) continue;
dp[i][l][k]=max(dp[i][l][k],dp[i-][j][l]+bit[k]);
}
}
}
}
int ans=;
for(int i=;i<=m;i++)
for(int j=;j<=cnt;j++)
for(int l=;l<=cnt;l++)
ans=max(ans,dp[i][j][l]);
printf("%d\n",ans);
return ;
}
 

最新文章

  1. iOS开发 GET、POST请求方法(NSURLConnection篇)
  2. JVM再了解了解
  3. android 发短信
  4. 【kAri OJ605】陈队的树
  5. jquery 之height(),innerHeight(),outerHeight()方法区别详解
  6. 【转】Spring注解@Component、@Repository、@Service、@Controller区别
  7. ASP.NET常用技术之加密解密
  8. cf C. Matrix
  9. 大爱jQuery,10美女模特有用jQuery/CSS3插入(集成点免费下载)
  10. 201521123040《Java程序设计》第4周学习总结
  11. 编写高质量的Python代码系列(七)之协作开发
  12. AndroidTV端的requestFocus()问题
  13. 异常:getHibernateFlushMode is not valid without active transaction; nested exception is org.hibernate.HibernateException: getHibernateFlushMode is not valid without active transaction getHibernateFlu
  14. mongodb 数据库中 的聚合操作
  15. javascript 伪数组和转化为标准数组
  16. Hdp安装问题杂解
  17. flask_SQLALchemy之多表查询
  18. Unity3d中的属性(Attributes)整理
  19. ZH奶酪:PHP如何判断提交表单中多个复选框是否选中?
  20. Oracle表分区分为四种:范围分区,散列分区,列表分区和复合分区(转载)

热门文章

  1. Openstack 10 云环境安装
  2. Paper Reading - Sequence to Sequence Learning with Neural Networks ( NIPS 2014 )
  3. Fedora 28 UEFI模式安装过程记录
  4. Linux下文件的打包、解压缩指令——tar,gzip,bzip2
  5. 20172305 2018-2019-1 《Java软件结构与数据结构》第六周学习总结
  6. Java:类集框架中集合的学习
  7. MacOS下搭建python环境
  8. A10
  9. sysbench 环境安装,压测mysql
  10. apache常用的两种工作模式 prefork和worker