题目

传送门:QWQ

分析

看到$ M<=10 $考虑状压。

然后把每行都压一下,那么每个状态相关的就是上一行和上上行的状态。

然后枚举。

然后复杂度最坏是$ O(100 \times 1024^3) $的

仔细分析一下,有很多状态是无用的,但还是被判断了,比如$ 11111 $,显然不能做到不误伤。

那么我们把所有可能的状态拉出来(据说小于70?),即代码中的$ st $数组

然后用$ dp[i][j][k] $ 表示前i行上行状态st[j]本行状态st[k]的最大炮兵数量

然后就可以通过上行和上上行很快的更新了

最后统计答案时把最后一行每个位置都要算一下。

代码

#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=;
int all[maxn], dp[][][], num[];
int ans=-1e9, ks=, n, m, st[maxn], sum[maxn], cnt;
char map[maxn][maxn];
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
scanf("%s",map[i]);
for(int j=;j<m;j++){
if(map[i][j]=='H') all[i]|=(<<j);
}
}
for(int i=;i<=;i++){
for(int j=i;j;j>>=) if(j%) num[i]++;
}
for(int i=;i<(<<m);i++) //预处理出一行可能的状态
if(!(i&(i<<)) && !(i&(i<<))) st[++cnt]=i,sum[cnt]=num[i];
for(int i=;i<=cnt;i++) if(!(st[i]&all[])) dp[][][i]=sum[i];
int ans=;
//dp[i][j][k]前i行上行状态st[j]本行状态st[k]
for(int i=;i<n;i++){
for(int j=;j<=cnt;j++){
for(int k=;k<=cnt;k++){
if(st[j]&st[k]) continue;
for(int l=;l<=cnt;l++){
if(!(st[j]&st[l])&&!(st[k]&st[l])&&!(st[l]&all[i+])){
dp[i+][k][l]=max(dp[i+][k][l], dp[i][j][k]+sum[l]);
}
}
}
}
}
for(int i=;i<=cnt;i++)
for(int j=;j<=cnt;j++)
ans=max(ans,dp[n][i][j]);
printf("%d",ans);
return ;
}

【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)

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

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

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

  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. luogu 2704 炮兵阵地 状压dp

    状压的基础题吧 第一次看感觉难上天,后来嘛就.. 套路:先根据自身状态筛出可行状态,再根据地图等其他限制条件筛选适合的状态加入答案 f i,j,k 分别代表 行数,本行状态,上行状态,再累加答案即可 ...

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

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

随机推荐

  1. Android -- 图片处理, 画画板,缩放,旋转,平移,镜面,倒影,图片合成,颜色处理

    1. 画画板 示例代码 public class MainActivity extends Activity { private ImageView iv; private Bitmap baseBi ...

  2. Android SDK manager 闪退

    在SDK安装目录找到tools文件夹,点击进入找到android.bat右键编辑:找到如下指令: rem Check we have a valid Java.exe in the path. set ...

  3. [转][osg]osg渲染引擎框架图,流程图(根据《最长一帧》整理)

    转自:http://m.blog.csdn.net/article/details?id=49679731 本文参考<<osg最长一帧>>, <<OpenScene ...

  4. 《WAP》第一次作业:团队亮相

    一.队名:WAP! 二.团队成员组长 组员 : 201571030302/杜有海 201571030327/乌勒扎 201571030304/郝明宇 201571030318/马麒 组长: 20157 ...

  5. Android 自定义注解(Annotation)

    现在市面上很多框架都有使用到注解,比如butterknife库.EventBus库.Retrofit库等等.也是一直好奇他们都是怎么做到的,注解的工作原理是啥.咱们能不能自己去实现一个简单的注解呢. ...

  6. spring Security简介

    它是spring的权限管理框架

  7. java网络编程之Socket编程

    概念 网络编程分为BIO(传统IO).NIO.AIO.Socket编程属于BIO这种传统IO. InetAddress java.net.InetAddress是JAVA中管理IP地址的类,常用 pu ...

  8. 移动APP测试要点总结

    ***微信扫一扫,关注“python测试开发圈”,了解更多测试教程!***

  9. 050——VUE中使用js库控制vue过渡动作

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. secureCRT不能输入

    用secureCRT建了一个串口COM1后,连接上开发板后,可以正确接受和显示串口的输出,但是按键输入无效. 解决: Session Options -> Connection -> Se ...