思路:和上一篇思路一样,但是这里要求最大能排几个,这里要开三维,记录上次和上上次的状态,再一一判定,状态转移方程为 dp[i][j][k] = max(dp[i][j][k],dp[i - 1][k][t] + num[j])

代码:

#include<cstdio>
#include<map>
#include<set>
#include<queue>
#include<cstring>
#include<string>
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define ll long long
const int N = 500+5;
const int MOD = 100000000;
const int INF = 0x3f3f3f3f;
using namespace std;
int n,m,top;
int cur[110],state[110],dp[110][110][110],num[110];
void init(){
top = 0;
int tot = 1 << m;
for(int i = 0;i < tot;i++){
if(i&(i<<1) || i&(i<<2)) continue;
state[++top] = i;
for(int j = 0;j < m;j++){
if(i&1<<j) num[top]++;
}
}
}
int main(){
char s[12];
scanf("%d%d",&n,&m);
memset(dp,0,sizeof(dp));
memset(num,0,sizeof(num));
memset(cur,0,sizeof(cur));
memset(state,0,sizeof(state));
init();
for(int i = 1;i <= n;i++){
scanf("%s",s + 1);
cur[i] = 0;
for(int j = 1;j <= m;j++){
if(s[j] == 'H'){
cur[i] |= 1<<(j - 1);
}
}
}
for(int i = 1;i <= top;i++){
if(cur[1]&state[i]) continue;
dp[1][i][1] = num[i];
}
for(int i = 1;i <= top;i++){
if(cur[2]&state[i]) continue;
for(int j = 1;j <= top;j++){
if(cur[1]&state[j]) continue;
if(state[i]&state[j]) continue;
for(int k = 1;k <= top;k++){
dp[2][i][j] = max(dp[2][i][j],dp[1][j][k] + num[i]);
}
}
}
for(int i = 3;i <= n;i++){
for(int j = 1;j <= top;j++){
if(cur[i]&state[j]) continue;
for(int k = 1;k <= top;k++){
if(cur[i - 1]&state[k]) continue;
if(state[j]&state[k]) continue;
for(int t = 1;t <= top;t++){
if(cur[i - 2]&state[t]) continue;
if(state[k]&state[t]) continue;
if(state[j]&state[t]) continue;
dp[i][j][k] = max(dp[i][j][k],dp[i - 1][k][t] + num[j]);
}
}
}
}
ll ans = 0;
for(int i = 1;i <= top;i++){
for(int j = 1;j <= top;j++){
if(dp[n][i][j] > ans) ans = dp[n][i][j];
}
}
printf("%lld\n",ans);
return 0;
}

POJ 1185 炮兵阵地(状压DP)题解的更多相关文章

  1. POJ 1185 炮兵阵地 状压dp

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

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

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

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

    题目链接 POJ 1185 今天艾教留了一大堆线段树,表示做不动了,就补补前面的题.QAQ 这个题,我第一次写还是像前面HDU 2167那样写,发现这次影响第 i 行的还用i-2行那样,那以前的方法就 ...

  4. [poj 1185] 炮兵阵地 状压dp 位运算

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

  5. POJ1185 炮兵阵地 —— 状压DP

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

  6. TZOJ 4912 炮兵阵地(状压dp)

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

  7. 洛谷P2704 [NOI2001]炮兵阵地 [状压DP]

    题目传送门 炮兵阵地 题目描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图 ...

  8. [POJ1185][NOI2001]炮兵阵地 状压DP

    题目链接:http://poj.org/problem?id=1185 很裸的状压,考虑对于一行用二进制储存每一种的状态,但是状态太多了做不了. 观察到有很多状态都是不合法的,于是我们预处理出合法的状 ...

  9. [NOI2001]炮兵阵地 状压DP

    题面: 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图.在每一格平原地形上最多 ...

  10. 炮兵阵地 /// 状压DP oj26314

    题目大意: 炮兵阵地 设置炮兵的位置 其上两位 下两位 左两位 右两位 不能同时设置炮兵 这题是 corn fields玉米地 的升级版 可以先看下这题的注释 更详细些 第一种方法是网上大多数题解的解 ...

随机推荐

  1. WEB安全番外第六篇--关于通过记录渗透工具的Payload来总结和学习测试用例

    背景: 在WEB安全的学习过程中,了解过了原理之后,就是学习各种Payload,这里面蕴藏着丰富的知识含量,是在基本上覆盖了漏洞原理之后的进一步深入学习的必经之路.无理是Burpsuite还是Sqlm ...

  2. CentOS下安装cvechecker并进行主机基线安全检查

    一.cvechecker的安装 1.首先下载cvechecker并解压该文件: cd /home/username mkdir cve wget https://raw.githubuserconte ...

  3. maven项目使用SOLR时报 previously initiated loading for a different type with name "javax/servlet/http/HttpServletRequest" 错的解决方法

    环境:Apache solr4.8,maven3,IntellijIDEA 想在项目中使用solr 在pom.xml文件中添加了solr的依赖 solr-core,solrj 和solr-dataim ...

  4. CentOS6.8系统安装Oracle11g

    1.官网上下载 软件安装包: linux.x64_11gR2_database_1of2.zip linux.x64_11gR2_database_2of2.zip 解压后: 生成文件夹: datab ...

  5. Python - 3.6 学习二

    Python 的高级特性 切片 对于指定索引范围取值的操作,Python提供了slice方法,类似于Excel中数据透视表的切片器. >>> L = ['Michael', 'Sar ...

  6. 从零打造在线网盘系统之Hibernate查询与更新技术

    欢迎浏览Java工程师SSH教程从零打造在线网盘系统系列教程,本系列教程将会使用SSH(Struts2+Spring+Hibernate)打造一个在线网盘系统,本系列教程是从零开始,所以会详细以及着重 ...

  7. pta 习题集5-6 堆栈操作合法性

    假设以S和X分别表示入栈和出栈操作.如果根据一个仅由S和X构成的序列,对一个空堆栈进行操作,相应操作均可行(如没有出现删除时栈空)且最后状态也是栈空,则称该序列是合法的堆栈操作序列.请编写程序,输入S ...

  8. 徐州网络赛G-Trace【线段树】

    There's a beach in the first quadrant. And from time to time, there are sea waves. A wave ( xx , yy  ...

  9. sql 中如何将返回的记录某一条置顶

    将table1中id 为2的记录置顶select * from table1order by case when id='2' then 0 else 1 end 例子:将已发布的置顶,status  ...

  10. MySQL 慢查询日志工具之pt-query-digest

    1. 工具简介 pt-query-digest是用于分析mysql慢查询的一个工具,它可以分析binlog.General log.slowlog,也可以通过SHOWPROCESSLIST或者通过tc ...