TZOJ 4912 炮兵阵地(状压dp)
描述
司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队。一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P"表示),如下图。在每一格平原地形上最多可以布置一支炮兵部队(山地上不能够部署炮兵部队);一支炮兵部队在地图上的攻击范围如图中黑色区域所示:

如果在地图中的灰色所标识的平原上部署一支炮兵部队,则图中的黑色的网格表示它能够攻击到的区域:沿横向左右各两格,沿纵向上下各两格。图上其它白色网格均攻击不到。从图上可见炮兵的攻击范围不受地形的影响。
现在,将军们规划如何部署炮兵部队,在防止误伤的前提下(保证任何两支炮兵部队之间不能互相攻击,即任何一支炮兵部队都不在其他支炮兵部队的攻击范围内),在整个地图区域内最多能够摆放多少我军的炮兵部队。
输入
第一行包含两个由空格分割开的正整数,分别表示N和M;
接下来的N行,每一行含有连续的M个字符('P'或者'H'),中间没有空格。按顺序表示地图中每一行的数据。N <= 100;M <= 10。
输出
仅一行,包含一个整数K,表示最多能摆放的炮兵部队的数量。
样例输入
5 4
PHPP
PPHH
PPPP
PHPP
PHHP
样例输出
6
题意
在N*M的阵地上最多能放多少炮兵部队,要求不能出现误伤(攻击范围如上图),炮兵只能放在平原P
题解
状压dp经典题
可以发现当前行由前两行状态决定,所以可以开三维数组,dp[i][j][k]代表第i行j状态和第i-1行k状态
首先枚举所有状态存进state数组,根据题意每2个1中间至少有2个0,可以发现总数不会超过100
状态转移方程dp[i][j][k]=dp[i-1][k][l]+sum[j](sum[j]状态j有几个炮兵)表示第i行j状态和第i-1行k状态由第i-1行k状态和第i-2行l状态转移过来
预处理的时候要先把1和2处理出来
代码
#include<stdio.h>
#include<algorithm>
using namespace std; int dp[][][],state[],cur[],sum[];
int cal(int x)
{
int ret=;
while(x)ret+=(x&),x>>=;
return ret;
}
int main()
{
int n,m;
char s[];
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
scanf("%s",s+);
for(int j=;j<=m;j++)
if(s[j]=='H')
cur[i]+=<<(m-j);
} ///init
int tot=;
for(int i=;i<(<<m);i++)
if(!(i&(i<<))&&!(i&(i<<)))
state[++tot]=i,sum[tot]=cal(i); ///
for(int i=;i<=tot;i++)
if(!(state[i]&cur[]))
dp[][i][]=sum[i]; ///
for(int i=;i<=tot;i++)
{
if(state[i]&cur[])continue;
for(int j=;j<=tot;j++)
{
if(state[j]&cur[])continue;
dp[][i][j]=max(dp[][i][j],dp[][j][]+sum[i]);
}
} for(int i=;i<=n;i++)
for(int j=;j<=tot;j++)///i行j状态,需要部署炮兵的状态
{
if(state[j]&cur[i])continue;
for(int k=;k<=tot;k++)///i-1行k状态
{
if(state[k]&cur[i-])continue;
for(int l=;l<=tot;l++)///i-2行l状态
{
if(state[l]&cur[i-])continue;
if((state[j]&state[k])||(state[j]&state[l])||(state[k]&state[l]))continue;
dp[i][j][k]=max(dp[i][j][k],dp[i-][k][l]+sum[j]);
}
}
} int res=;
for(int i=;i<=tot;i++)
for(int j=;j<=tot;j++)
res=max(res,dp[n][i][j]);
printf("%d\n",res);
return ;
}
TZOJ 4912 炮兵阵地(状压dp)的更多相关文章
- 洛谷P2704 [NOI2001]炮兵阵地 [状压DP]
题目传送门 炮兵阵地 题目描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图 ...
- POJ1185 炮兵阵地 —— 状压DP
题目链接:http://poj.org/problem?id=1185 炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions ...
- poj - 1185 炮兵阵地 状压DP 解题报告
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 21553 Accepted: 8363 Description ...
- luogu 2704 炮兵阵地 状压dp
状压的基础题吧 第一次看感觉难上天,后来嘛就.. 套路:先根据自身状态筛出可行状态,再根据地图等其他限制条件筛选适合的状态加入答案 f i,j,k 分别代表 行数,本行状态,上行状态,再累加答案即可 ...
- POJ 1185 炮兵阵地 状压dp
题目链接: http://poj.org/problem?id=1185 炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K 问题描述 司令部的将军们打算在N*M ...
- [NOI2001]炮兵阵地 状压DP
题面: 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图.在每一格平原地形上最多 ...
- [POJ1185][NOI2001]炮兵阵地 状压DP
题目链接:http://poj.org/problem?id=1185 很裸的状压,考虑对于一行用二进制储存每一种的状态,但是状态太多了做不了. 观察到有很多状态都是不合法的,于是我们预处理出合法的状 ...
- 炮兵阵地 /// 状压DP oj26314
题目大意: 炮兵阵地 设置炮兵的位置 其上两位 下两位 左两位 右两位 不能同时设置炮兵 这题是 corn fields玉米地 的升级版 可以先看下这题的注释 更详细些 第一种方法是网上大多数题解的解 ...
- P2704 [NOI2001]炮兵阵地 (状压DP)
题目: P2704 [NOI2001]炮兵阵地 解析: 和互不侵犯一样 就是多了一格 用\(f[i][j][k]\)表示第i行,上一行状态为\(j\),上上行状态为\(k\)的最多的可以放的炮兵 发现 ...
随机推荐
- scala 爬虫 去除不能存储的特殊字符
scala 爬虫 去除不能存储的特殊字符 /** * 去除不能存储的特殊字符 */ def zifuChange(str: String): String = { var bo = true var ...
- maven的环境变量配置
一: 首先下载maven, 下载地址:http://maven.apache.org/download.html 打开这个连接:选择File下面的apache-maven-3.2.1-bin.zip链 ...
- The value for the useBean class attribute xxx is invalid
JSP页面报这个错可能的原因: 1:指定的 Bean 类没找到 2:该类不是 public 的,或者找到的 class 文件是 interface 或抽象类 3:Bean 类中没有 public 的无 ...
- 腾讯助理PHP开发工程师外包岗面经
校招错过腾讯了,在社招上看到腾讯有招外包岗,要求比正式岗低,于是抱着试一试的心态投了简历,没一会就收到了笔试题,还算简单. 第二天收到面试官的面试邀请,然后去面试了…… 腾讯里面真是漂亮,光是看装潢就 ...
- mybatis 获取insert返回的主键
在我们开发过程中,在插入数据到数据库时,很多时候都需要把其主键返回,这里就说一下mybatis是怎么获取的. 其中mysql和oracle是不同的做法,因为mysql本身就提供字段自增的属性,而ora ...
- [PHP]PHP的session机制,配置与高级应用
---------------------------------------------------------------------------------------------------- ...
- 吴裕雄 python 机器学习-Logistic(1)
import numpy as np def loadDataSet(): dataMat = [] labelMat = [] fr = open('D:\\LearningResource\\ma ...
- 吴裕雄 python oracle子查询的用法(3)
import cx_Oracle conn = cx_Oracle.connect("scott/admin@localhost:1521/orcl")cursor = conn. ...
- java中garadle工程没有src问题
https://www.jb51.net/article/142791.htm 前几天遇到一个问题,就是使用ider创建gradle项目后,src目录没有自动生成出来,今天就给大家分享一下怎么解决. ...
- tomcat 修改jdk版本号
set JAVA_OPTS=-Djute.maxbuffer=2048000 set console_log=true set CATALINA_OPTS=-server -Xdebug -Xnoag ...