Problem 炮兵阵地

题目大意

  给你一张n*m的地图,一些地区是空地,一些地区是障碍。

  可以在空地上布置炮兵部队,炮兵部队的攻击范围为上下左右各两格。

  询问最多可以布置多少个炮兵部队,且互不伤害。

  0<=N <= 100 , 0<=M <= 10

解题分析

  由于攻击范围是两格,所以用dp[i][j][k]表示做到i行,上一行的状态为j,上上行的状态为k。

  判断上下两行的状态i,j是否矛盾,直接判断 i&j 是否为0即可。

  判断同一行的状态i是否矛盾,用 i & (i>>1) 来判断是否有相邻的炮兵部队,用 i & (i>>2) 来判断是否有间隔一格的炮兵部队。

  如果直接用2^10来表示状态会存不下,则首先预处理一下每行的可行状态即可。

  Tips :  == 的优先度要比 & 高。

参考程序

 #include <map>
#include <set>
#include <stack>
#include <queue>
#include <cmath>
#include <ctime>
#include <string>
#include <vector>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cassert>
#include <iostream>
#include <algorithm>
#pragma comment(linker,"/STACK:102400000,102400000")
using namespace std; #define N 508
#define M 50008
#define LL long long
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define clr(x,v) memset(x,v,sizeof(x));
#define bitcnt(x) __builtin_popcount(x)
#define rep(x,y,z) for (int x=y;x<=z;x++)
#define repd(x,y,z) for (int x=y;x>=z;x--)
const int mo = ;
const int inf = 0x3f3f3f3f;
const int INF = ;
/**************************************************************************/
int n,m;
char mp[][];
int g[][];
int dp[][][]; int main(){
scanf("%d%d",&n,&m);
rep(i,,n) scanf("%s",mp[i]+);
for (int i=;i<=n;i++){
for (int j=;j<<<m;j++)
{
int flag=;
rep(k,,m)
if (j & <<k- && mp[i][k]=='H')
flag=;
if (j & j>>) flag=;
if (j & j>>) flag=;
if (flag) g[i][++g[i][]]=j;
}
}
rep(i,,g[][]) dp[][i][]=bitcnt(g[][i]);
rep(i,,g[][])
rep(j,,g[][])
if (!(g[][i] & g[][j]))
dp[][i][j]=max(dp[][i][j],dp[][j][]+bitcnt(g[][i])); rep(i,,n)
rep(j,,g[i][])
rep(k,,g[i-][])
rep(l,,g[i-][])
if (!(g[i][j] & g[i-][k]))
if (!(g[i][j] & g[i-][l]))
if (!(g[i-][k] & g[i-][l]))
dp[i][j][k]=max(dp[i][j][k],dp[i-][k][l]+bitcnt(g[i][j]));
int res=;
rep(i,,g[n][]) res=max(res,dp[][i][]);
rep(i,,g[n][])
rep(j,,g[n-][]) res=max(res,dp[n][i][j]);
printf("%d\n",res);
}

poj 1185 (状压dp)的更多相关文章

  1. poj 1185(状压dp)

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

  2. poj 1185 状压dp+优化

    http://poj.org/problem?id=1185 炮兵阵地 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 291 ...

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

    题意:n*m地图'H'能放'p'不能放,布兵的方格上下左右不能布兵,给你地图求最大布兵数 分析:关系到前两行,所以dp[i][j][k]第i行状态为j,i-1行状态为k时的最大布兵数, 先求出所有可行 ...

  4. POJ 3254 (状压DP) Corn Fields

    基础的状压DP,因为是将状态压缩到一个整数中,所以会涉及到很多比较巧妙的位运算. 我们可以先把输入中每行的01压缩成一个整数. 判断一个状态是否有相邻1: 如果 x & (x << ...

  5. poj 1170状压dp

    题目链接:https://vjudge.net/problem/POJ-1170 题意:输入n,表示有那种物品,接下来n行,每行a,b,c三个变量,a表示物品种类,b是物品数量,c代表物品的单价.接下 ...

  6. hdu 1185 状压dp 好题 (当前状态与上两行有关系)

    /* 状压dp 刚开始&写成&&看了好长时间T0T. 状态转移方程 dp[i][k][j]=Max(dp[i][k][j],dp[i-1][l][k]+num[i][j]);( ...

  7. POJ 3254 状压DP

    题目大意: 一个农民有一片n行m列 的农场   n和m 范围[1,12]  对于每一块土地 ,1代表可以种地,0代表不能种. 因为农夫要种草喂牛,牛吃草不能挨着,所以农夫种菜的每一块都不能有公共边. ...

  8. POJ 2411 状压DP经典

    Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 16771   Accepted: 968 ...

  9. poj 3254 状压dp入门题

    1.poj 3254  Corn Fields    状态压缩dp入门题 2.总结:二进制实在巧妙,以前从来没想过可以这样用. 题意:n行m列,1表示肥沃,0表示贫瘠,把牛放在肥沃处,要求所有牛不能相 ...

  10. poj 2923 状压dp+01背包

    好牛b的思路 题意:一系列物品,用二辆车运送,求运送完所需的最小次数,两辆车必须一起走 解法为状态压缩DP+背包,本题的解题思路是先枚举选择若干个时的状态,总状态量为1<<n,判断这些状态 ...

随机推荐

  1. UIDatePicker 日期/时间选取器(滚轮)—IOS开发

    UIDatePicker 是一个控制器类,封装了 UIPickerView,但是他是UIControl的子类,专门用于接受日期.时间和持续时长的输入.日期选取器的各列会按照指定的风格进行自动配置,这样 ...

  2. GMF:如何在不打开Editor的情况下生成图片

    问题 GMF应用中,有时我们希望在不打开*DiagramEditor的情况下,从文件就能生成它的图片   解决方案 首先,从文件中构造DiagramImpl实例: TransactionalEditi ...

  3. 太牛X了!神奇的故事 你猜得到开头,却猜不到结尾

    他在北京发来消息:“我明天去看你,来接我,好么?” 她在南京,开心地回复:“恩啊” 第二天,她在车站搜寻过往人群中他的身影, 期待又焦急“你到底在哪儿?” “傻瓜,你不会真在车站吧,今天是愚人节哎,哈 ...

  4. centos 7

    vmlinuz initrd=initrd.img linux dd quiet vmlinuz initrd=initrd.img inst.stage2=hd:/dev/sdb4 quiet 关I ...

  5. 《点石成金:访客至上的Web和可用性设计秘笈(原书第3版)》--- 读书笔记

    这是一本绝妙的书, 它的英语书名是“Don't make me think”.更确切的说是个小册子, 但是作者的语言实在是让人忍俊不禁. 真TM的有趣, 为毛外国人就能写出如此美妙的书? 而国人却不能 ...

  6. js获取url参数 兼容某些带#url

    网上有大把现成的代码,不过有点小小的瑕疵 例如目前最流行的 正则法: function getArgument(_arg) { var reg = new RegExp("(^|&) ...

  7. 从零开始HTML(三 2016/9/20)

    1.HTML表单 HTML 表单用于搜集不同类型的用户输入.<form> 元素,HTML 表单用于收集用户输入.<form> 元素 ①<input> 元素,< ...

  8. Centos系统下Lamp环境的快速搭建(超详细,转)

    lamp的搭建对于初学者是一件很头疼的事情,所以借此机会把自己当初快速搭建linux+apche+mysql+php的方法分享大家希望能到你. 工具/原料 虚拟机及Centos操作系统 Linux基本 ...

  9. Head First 设计模式--2 观察者模式 解耦

    观察者模式定义了对象之间一对多的依赖,这样依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新. 假如有这么一个项目,监控每天的天气状况WeatherData(温度,湿度,气压).有布告板 ...

  10. oracle 语句 字段拼接(可换行)

    eg: update tablename t set t.nr = '"+NR1+"' || '<br/>' ||'"+NR2+"' where 条 ...