炮兵阵地

Time Limit: 2000ms
Memory Limit: 65536KB

This problem will be judged on PKU. Original ID: 1185
64-bit integer IO format: %lld      Java class name: Main

 
司令部的将军们打算在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

 
解题:状压dp,我的第一道状态压缩dp。代码明天给上。
 
巧妙地处理任何三进制位没有禁止位置,就是不能放置的位置,只要把 temp&(temp<<1)|temp&(temp<<2)进行判断就可以了,十分方便,避免了不必要的分解和判断。
 
 
 #include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <climits>
#include <vector>
#include <queue>
#include <cstdlib>
#include <string>
#include <set>
#define LL long long
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = ;
int state[],num[],dp[maxn][][],mp[maxn];
int r,c,cnt;
void preSolve(){
int i,j,temp,v = <<c;
memset(num,,sizeof(num));
for(cnt = i = ; i < v; i++){
temp = i;
if((temp&(temp<<))|(temp&(temp<<))) continue;
state[cnt] = temp;
while(temp){num[cnt] += temp&;temp >>= ;}
cnt++;
}
}
int go(){
int ans = ,i,j,k,t;
preSolve();
memset(dp,,sizeof(dp));
for(i = ; i < r; i++){
for(j = ; j < cnt; j++){
if(mp[i]&state[j]) continue;
if(i == ){
dp[i][j][] = num[j];
}else if(i == ){
for(k = ; k < cnt; k++){
if(state[j]&state[k]) continue;
dp[i][j][k] = max(dp[i][j][k],dp[i-][k][]+num[j]);
}
}else{
for(t = ; t < cnt; t++){
if(state[j]&state[t]) continue;
for(k = ; k < cnt; k++){
if(state[k]&state[j]||state[k]&state[t]) continue;
dp[i][j][t] = max(dp[i][j][t],dp[i-][t][k]+num[j]);
}
}
}
}
}
for(j = ; j < cnt; j++)
for(k = ; k < cnt; k++)
ans = max(ans,dp[r-][j][k]);
return ans;
}
int main(){
char str[];
int i,j;
while(~scanf("%d%d",&r,&c)){
for(i = ; i < r; i++){
scanf("%s",str);
mp[i] = ;
for(j = c-; j >= ; j--){
if(str[j] == 'H') mp[i] += <<(c-j-);
}
}
printf("%d\n",go());
}
return ;
}

xtu DP Training C.炮兵阵地的更多相关文章

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

    题目链接:https://cn.vjudge.net/contest/276236#problem/B 题目大意:略  具体思路:和我的上一篇写状压dp的思路差不多,不过就是这个题相当于上一个题的升级 ...

  2. xtu DP Training B. Collecting Bugs

    B. Collecting Bugs Time Limit: 10000ms Memory Limit: 64000KB 64-bit integer IO format: %lld      Jav ...

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

    炮兵阵地 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 26426   Accepted: 10185 Descriptio ...

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

    题目直达车:   POJ 1185 炮兵阵地 分析: 列( <=10 )的数据比较小, 一般会想到状压DP. Ⅰ.如果一行10全个‘P’,满足题意的状态不超过60种(可手动枚举). Ⅱ.用DFS ...

  5. poj - 1185 炮兵阵地 状压DP 解题报告

    炮兵阵地 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 21553   Accepted: 8363 Description ...

  6. [poj1185]炮兵阵地_状压dp

    炮兵阵地 poj-1185 题目大意:给出n列m行,在其中添加炮兵,问最多能加的炮兵数. 注释:n<=100,m<=10.然后只能在平原的地方建立炮兵. 想法:第2到状压dp,++.这题显 ...

  7. POJ_1185_炮兵阵地 dp+状态压缩

    题目:炮兵阵地 链接:http://poj.org/problem?id=1185 解题思路: 首先用 int 来表示每一行的情况,比如说第一行是k1,那么[ k1&(k1>>2) ...

  8. POJ 1185 炮兵阵地 状压dp

    题目链接: http://poj.org/problem?id=1185 炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K 问题描述 司令部的将军们打算在N*M ...

  9. poj1185 炮兵阵地【状压DP】

    炮兵阵地 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 32802   Accepted: 12650 Descriptio ...

随机推荐

  1. Angular4项目,默认的package.json创建及配置

        1.使用如下命令,可以创建一个默认的 package.json npm  init     创建后如下图所示: 添加 angular4 的 dependencies: npm install@ ...

  2. 7.1 Java集合概述

    List 有序.重复的集合 Set 无序.不可重复的集合 Map 具有映射关系的集合 jdk1.5之后.Java增加了Queue体系集合,代表一种队列集合实现

  3. 关于web中的路径

    做了许多Demo发现,浏览器解析的路径和服务器解析的路径是不同的.我们知道,路径加上/的时候,表示的是绝对路径的意思,而如果是服务器解析的话,这个/相对的是我们的web应用,即相对于http://19 ...

  4. 1051 - Good or Bad DFS 记忆化搜索

    http://lightoj.com/volume_showproblem.php?problem=1051 对于每个位置,设dfs(cur, one, two)表示前i个字母,拥有辅音字母one个, ...

  5. js数据类型之判断

    js有几种类型,具体是:字符串(String).数字(Number).布尔(Boolean).数组(Array).对象(Object).空(Null).未定义(Undefined). js提供了typ ...

  6. AJPFX总结I/O流操作(一)

    在软件开发中,数据流和数据库操作占据了一个很重要的位置,所以,熟悉操作数据流和数据库,对于每一个开发者来说都是很重要的,今天就来总结一下I/O,数据库操作 一:从数据流开始 首先先有一个结构图看一下整 ...

  7. axios的简单封装及在组件内使用

    /**第一步 * 配置编译环境和线上环境之间的切换 * baseUrl: 域名地址 * routerMode: 路由模式 * imgBaseUrl: 图片所在域名地址 * */ let Host = ...

  8. 洛谷 P1832 A+B Problem(再升级)

    题目背景 ·题目名称是吸引你点进来的 ·实际上该题还是很水的 题目描述 ·1+1=? 显然是2 ·a+b=? 1001回看不谢 ·哥德巴赫猜想 似乎已呈泛滥趋势 ·以上纯属个人吐槽 ·给定一个正整数n ...

  9. 原创:四种Linux系统开机启动项优命令超给力超详细详解

    老葵花哥哥又开课了 接下来是你们的齐天大圣孙悟空给你们带来的详细版Linux系统开机启动优化四种命令 第一种方法是很正常的 第二种有点难理解 第三种来自我的一个奇思妙想 本文档秉承 不要钱也不要臀部的 ...

  10. vuez init webStorm

    <!-- * @description text !--> <template> <div>#[[$END$]]#</div> </templat ...