火炮
Time Limit: 2000MS   Memory Limit: 65536K
Total Submissions: 19690   Accepted: 7602

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

不easy啊,debug了一下午。

。。

</pre><pre name="code" class="cpp">#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
#define N 105
const int inf=0x3fffffff;
char g[N][15];
int num[65],cnt[65],cur[N];
int top,dp[N][65][65];
int getsum(int x)
{int t=0;while(x)    //得到X转换成为二进制后1的个数{x&=(x-1);t++;}return t;
}
void inti(int m)
{int i;top=0;memset(num,-1,sizeof(num));for(i=0;i<(1<<m);i++){if(i&(i<<1)) continue;if(i&(i<<2)) continue;num[top]=i;cnt[top++]=getsum(i);}
}
int main()
{int i,j,k,r,n,m;inti(10);while(scanf("%d%d",&n,&m)!=-1){for(i=0;i<n;i++){scanf("%s",g[i]);cur[i]=0;for(j=0;j<m;j++){if(g[i][j]=='H')cur[i]|=(1<<j);  //得到每一行的不可放置大炮的信息,  }}for(top=0;num[top]!=-1&&num[top]<(1<<m);top++);                     //由于当m=10时会訪问没有赋值的数组元素memset(dp,-1,sizeof(dp));for(i=0;i<top;i++){if(num[i]&cur[0]) continue;dp[0][i][0]=cnt[i];}for(r=1;r<n;r++) //枚举剩下的每一行  {for(i=0;i<top;i++) //每一行可取的每种组合  {if(cur[r]&num[i]) continue;for(j=0;j<top;j++) //上一行(i-1)的每种组合 {if(num[i]&num[j]) continue;for(k=0;k<top;k++)  //枚举i-2行的每种组合  {if(num[i]&num[k]) continue;if(num[j]&num[k]) continue;   //改成dp[r-1][j][k]==-1速度更快dp[r][i][j]=max(dp[r][i][j],dp[r-1][j][k]+cnt[i]);}     //当前行和第j、k行不冲突  }}}int ans=0;for(i=0;i<top;i++){for(j=0;j<top;j++)ans=max(ans,dp[n-1][i][j]);}printf("%d\n",ans);}return 0;
}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

转载于:https://www.cnblogs.com/bhlsheji/p/4659263.html

poj 1185 火炮 (减少国家DP)相关推荐

  1. 【状态dp】poj 1185 炮兵阵地(三维dp)

    poj 1185 炮兵阵地 http://poj.org/problem?id=1185 问题描述:给你一个n行m列的P-H矩阵,H表示不能安置炮兵,1可以安置炮兵,要求炮兵攻击管辖内不能在安置其他炮 ...

  2. POJ1185:火炮(减少国家)

    Description 命令将军打算N*M该网络格他们的炮兵部队部署在地图上.一个N*M该地图由N行M列,每个地图格它可以是山(使用"H" 表示),也可能是平原(用"P& ...

  3. Light OJ 1406 Assassin`s Creed 减少国家DP+支撑点甚至通缩+最小路径覆盖

    标题来源:Light OJ 1406 Assassin`s Creed 意甲冠军:向图 派出最少的人经过全部的城市 而且每一个人不能走别人走过的地方 思路:最少的的人能够走全然图 明显是最小路径覆盖问 ...

  4. POJ 1185 炮兵阵地(状态压缩DP)

    Description 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用&quo ...

  5. POJ 2411 Mondriaan#39;s Dream (dp + 减少国家)

    链接:http://poj.org/problem?id=2411 题意:题目描写叙述:用1*2 的矩形通过组合拼成大矩形.求拼成指定的大矩形有几种拼法. 參考博客:http://blog.csdn. ...

  6. poj 1185(状压dp)

    题目链接:http://poj.org/problem?id=1185 思路:状态压缩经典题目,dp[i][j][k]表示第i行状态为j,(i-1)行状态为k时最多可以放置的士兵个数,于是我们可以得到 ...

  7. POJ 1185 炮兵阵地 状压dp

    http://poj.org/problem?id=1185 经典题目不必多说,直接贴代码. 1 #include<cstdio> 2 #include<cstring> 3 ...

  8. POJ - 1185 炮兵阵地(状压dp)

    题目链接:点击查看 题目大意:中文题,题意很清晰,不多赘述 题目分析:最基础的状压dp,需要考虑如何转移,因为每一个炸弹所涉及的范围都是上下左右两个格子,我们可以从第一行开始向下转移,这样某一行的状态 ...

  9. POJ 1185 炮兵阵地(状压dp)

    http://poj.org/problem?id=1185 题意: 思路: 每一行最多只有10列,所以可以用二进制来表示每一行的状态. d[i][j][k]表示第i行状态为k时,并且上一行状态为j时 ...

最新文章

  1. mysql用户ip登录失败怎么办_MySQL使用IP地址登录 ERROR 1045 (28000) Access denied for use...
  2. leetcode(一)刷题两数之和
  3. vue 监听map数组变化_解决vue无法侦听数组及对象属性的变化问题
  4. mysqlbinlog 查看mysql bin 日志 mysqlbinlog: unknown variable 'default-character-set=utf8'
  5. shell中shift作用
  6. 分割字符串函数strtok
  7. python编程入门必备知识-python基础教程#菜鸟也能看懂的超简单入门必备知识
  8. Docker Swarm学习教程
  9. 《自己动手做交互系统》——1.2 制作过程
  10. 计算机网络基础B试题及答案,计算机网络基础试题及答案2
  11. sql注入攻击与防御java_注入攻击(SQL注入防御)
  12. python绘制中国_如何用Python画一个中国地图?
  13. 零成本赚钱小项目,轻松操作,完整版笔记分享给你
  14. R语言实现并行计算[parallel,Rdsm]
  15. 关于InnoDB存储引擎 text blob 大字段的存储和优化--转载
  16. 特殊数字符号大全,word 数学符号
  17. latex 论文算法编辑
  18. 一个 vue 登陆页面
  19. 《论语》原文及其全文翻译 学而篇14
  20. 【PyTorch深度学习实践】08_Softmax分类器(多分类)

热门文章

  1. 学用awk, 在linux下批量改名
  2. emacs的配色方案
  3. 语言程序设计 郭有强_「概念篇8」程序语言如何被计算机理解?靠猜?那就搞笑了...
  4. 单位元转换万元怎么转_PDF转CAD怎么转换
  5. mysql 从库修改表结构_在mysql数据库中---修改表结构
  6. Visual Studio 2019报4996错误的解决办法
  7. Python机器学习:SVM003Soft Margin和SVM(线性)的正则化
  8. 使用J-LINK烧写MICRO2440的NOR
  9. matlab怎么载入视频,怎样将视频导入matlab啊
  10. unity描边发光shader_unity shader实例#1 轮廓渲染-描边