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
 
与HDU4539基本上一样的题目,仅仅是在推断情况上有些不同而已
 
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std; int n,m;
char map[105][15];
int mat[105][15];
int now[1<<10],pre[1<<10],prepre[1<<10];
int l_now,l_pre,l_prepre;
int dp[1<<10][1<<10],tem[1<<10][1<<10],tt[1<<10]; void dfs(int id,int k,int p,int sum)
{
if(k>=m)
{
now[++l_now] = p;
tt[l_now] = sum;
return;
}
if(k>=2 && mat[id][k] && !(p&(1<<(k-2))) && !(p&(1<<(k-1))))
dfs(id,k+1,p|(1<<k),sum+1);
else if(k==1 && mat[id][k] && !(p&(1<<(k-1))))
dfs(id,k+1,p|(1<<k),sum+1);
else if(k == 0 && mat[id][k])
dfs(id,k+1,p|(1<<k),sum+1);
dfs(id,k+1,p,sum);
} void solve()
{
int i,j,k,t;
tem[1][1] = pre[1] = prepre[1] = 0;
l_pre = l_prepre = 1;
for(k = 0; k<n; k++)
{
l_now = 0;
dfs(k,0,0,0);
for(i = 1; i<=l_now; i++)
for(j = 1; j<=l_pre; j++)
dp[i][j] = 0;
for(i = 1; i<=l_now; i++)
for(j = 1; j<=l_pre; j++)
for(t = 1; t<=l_prepre; t++)
{
if(now[i] & prepre[t]) continue;
if(now[i] & pre[j]) continue;
if(pre[j] & prepre[t]) continue;
dp[i][j] = max(dp[i][j],tem[j][t]+tt[i]);
}
for(i = 1; i<=l_now; i++)
for(j = 1; j<=l_pre; j++)
tem[i][j] = dp[i][j];
for(i = 1; i<=l_pre; i++)
prepre[i] = pre[i];
for(i = 1; i<=l_now; i++)
pre[i] = now[i];
l_prepre = l_pre;
l_pre = l_now;
}
} int main()
{
int i,j,ans;
while(~scanf("%d%d",&n,&m))
{
for(i = 0; i<n; i++)
{
scanf("%s",map[i]);
for(j = 0; j<m; j++)
{
if(map[i][j] == 'P')
mat[i][j] = 1;
else
mat[i][j] = 0;
}
}
solve();
ans = 0;
for(i = 1; i<=l_pre; i++)
for(j = 1; j<=l_prepre; j++)
ans = max(ans,tem[i][j]);
printf("%d\n",ans);
} return 0;
}

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

POJ1185:火炮(减少国家)的更多相关文章

  1. poj 1185 火炮 (减少国家DP)

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

  2. hdu 4778 Rabbit Kingdom(减少国家)

    题目链接:hdu 4778 Rabbit Kingdom 题目大意:Alice和Bob玩游戏,有一个炉子.能够将S个同样颜色的宝石换成一个魔法石.如今有B个包,每一个包里有若干个宝石,给出宝石的颜色. ...

  3. 可能性dp+减少国家HDU4336

    Card Collector Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Subm ...

  4. poj - 1170 - Shopping Offers(减少国家dp)

    意甲冠军:b(0 <= b <= 5)商品的种类,每个人都有一个标签c(1 <= c <= 999),有需要购买若干k(1 <= k <=5),有一个单价p(1 & ...

  5. [ACM] hdu 5045 Contest (减少国家Dp)

    Contest Problem Description In the ACM International Collegiate Programming Contest, each team consi ...

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

    标题来源:problem=1406">Light OJ 1406 Assassin`s Creed 意甲冠军:向图 派出最少的人经过全部的城市 而且每一个人不能走别人走过的地方 思路: ...

  7. HDU 4433 locker 2012 Asia Tianjin Regional Contest 减少国家DP

    意甲冠军:给定的长度可达1000数的顺序,图像password像锁.可以上下滑动,同时会0-9周期. 每个操作.最多三个数字连续操作.现在给出的起始序列和靶序列,获得操作的最小数量,从起始序列与靶序列 ...

  8. Chapter06-Phylogenetic Trees Inherited(POJ 2414)(减少国家DP)

    Phylogenetic Trees Inherited Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 480 Accepted ...

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

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

随机推荐

  1. [CSS] Manipulate Images Using CSS Filter and Blend Modes

    Apply filters like blur, brightness, saturation and hue to images. Combined with CSS blend modes, yo ...

  2. python开发环境设置(windows)

    python开发环境设置(windows) 1)  python2.7.3安装 在www.python.org上下载python-2.7.6.amd64.msi软件.安装完毕后设置path路径.控制面 ...

  3. LinearLayout的一些注意事项 分类: H1_ANDROID 2013-10-26 23:01 856人阅读 评论(0) 收藏

    1.orientation的默认值为horizontal,即从左向右排列.由于一般从上向下排列,所以必须指定orientation属性. 2.layout_gravity与gravity的区别: (1 ...

  4. js进阶正则表达式9量词2(^和&作用:/^HTML5$/g匹配不到aHTML5b中的HTML5,不然是可以匹配到的)(/\d+(?=cm)/g)((?!cm))

    js进阶正则表达式9量词2(^和&作用:/^HTML5$/g匹配不到aHTML5b中的HTML5,不然是可以匹配到的)(/\d+(?=cm)/g)((?!cm)) 一.总结 ^和&作用 ...

  5. Android 延时执行的几种方法

    开启新线程 new Thread(new Runnable(){ public void run(){ Thread.sleep(XXXX); handler.sendMessage(); //告诉主 ...

  6. NSOperationQueue小结

    将建立的线程增加队列之中.他们都是并发运行的  假设想有一个线程在另外一个线程之后再运行的话 有一个方法能够实现- (void)addDependency:(NSOperation *)op; 这一个 ...

  7. Golang快速入门

    Go语言简介: Golang 简称 Go,是一个开源的编程语言,Go是从2007年末由 Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian L ...

  8. hdfs的基本原理和基本操作总结

    hdfs基本原理 Hadoop分布式文件系统(HDFS)被设计成适合执行在通用硬件(commodity hardware)上的分布式文件系统.它和现有的分布式文件系统有非常多共同点. 但同一时候,它和 ...

  9. UITableView的一些常用设置和代理方法

    - (void)viewDidLoad { [super viewDidLoad]; tableview = [[UITableView alloc]initWithFrame:CGRectMake( ...

  10. hibernate基本配置与简单增删改查

    ORM(Object Relation Mapping)是对象关系映射,是一个思想,它的作用是在关系数据库与对象之间做一个自动映射,将数据库中的表格映射到一个类,也就是持久化类,数据表中每行映射为对象 ...