传送门

状压dp经典题。

我们把每一行的状态压成01串。

预处理出每一行可能出现的状态,然后转移每个被压缩的状态的1的个数就行了。

注意当前行转移要考虑前两行的状态。

还要注意只有一行的情况。

代码:

#include<iostream>
#include<cctype>
#include<cstdio>
using namespace std;
inline int read(){
    int ans=0;
    char ch=getchar();
    while(!isdigit(ch))ch=getchar();
    while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
    return ans;
}
int sta[105][70],tot[105],n,m,f[105][70][70],cal[105][70];
inline int calc(int x){
    int ret=0;
    while(x)x-=x&-x,++ret;
    return ret;
}
int main(){
    n=read(),m=read(),tot[0]=1;
    for(int i=1;i<=n;++i){
        char s[15];
        int x=0;
        scanf("%s",s);
        for(int j=0;j<m;++j)if(s[j]=='H')x|=1<<j;
        for(int j=0;j<(1<<m);++j){
            if((j&(j<<1))||(j&(j<<2))||(j&x))continue;
            sta[i][++tot[i]]=j,cal[i][tot[i]]=calc(j);
        }
    }
    for(int i=1;i<=tot[1];++i)f[1][i][1]=cal[1][i];
    for(int i=1;i<=tot[2];++i)
        for(int j=1;j<=tot[1];++j){
            if(sta[2][i]&sta[1][j])continue;
            f[2][i][j]=max(f[2][i][j],f[1][j][1]+cal[2][i]);
        }
    for(int i=3;i<=n;++i){
        for(int j=1;j<=tot[i];++j)
            for(int k=1;k<=tot[i-1];++k){
                if(sta[i][j]&sta[i-1][k])continue;
                for(int l=1;l<=tot[i-2];++l){
                    if((sta[i][j]&sta[i-2][l])||(sta[i-1][k]&sta[i-2][l]))continue;
                    f[i][j][k]=max(f[i][j][k],f[i-1][k][l]+cal[i][j]);
                }
            }
    }
    int ans=0;
    for(int i=1;i<=tot[n];++i)
        for(int j=1;j<=tot[n-1];++j){
            if(sta[n][i]&sta[n-1][j])continue;
            ans=max(ans,f[n][i][j]);
        }
    cout<<ans;
    return 0;
}

2018.09.08 poj1185 炮兵阵地(状压dp)的更多相关文章

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

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

  2. poj1185 炮兵阵地 状压dp

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

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

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

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

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

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

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

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

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

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

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

  8. luogu 2704 炮兵阵地 状压dp

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

  9. POJ 1185 炮兵阵地 状压dp

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

随机推荐

  1. 模板引擎-freemarker

    Freemarker 是一款模板引擎,是一种基于模版生成静态文件的通用 工具,它是为java程序员提供的一个开发包. 可通过将Word或者Excel模板另存为xml格式,在其中修改要替换的内容. 基本 ...

  2. jsonp 原理

    1 json width padding(内填充); 2.计算机文件的属性 并不是以 文件的后缀名确定的,后缀名只是给人看的: 3.script 标签获取数据后 并不能直接使用: 4.尽可能 少声明 ...

  3. Haskell语言学习笔记(26)Identity, IdentityT

    Identity Monad newtype Identity a = Identity { runIdentity :: a } instance Functor Identity where fm ...

  4. 迷你MVVM框架 avalonjs 1.4发布

    主要带来以下三大改进: 全新的兼容AMD规范requirejs API的加载器 使用gulp进行构建 兼容性更好的触屏模块 最近还修改了avalon.modern bind方法的BUG,自定义过滤器的 ...

  5. 吴裕雄 python神经网络 水果图片识别(1)

    import osimport numpy as npimport matplotlib.pyplot as pltfrom skimage import color,data,transform,i ...

  6. tensor flow 安装

    http://blog.csdn.net/nxcxl88/article/details/52704877?locationNum=13 安装后,一定要运行这句话后   $ source activa ...

  7. Extending Conductor

    后端 导体提供了可插拔的后端.目前的实现使用Dynomite. 每个后端需要实现4个接口: //Store for workflow and task definitions com.netflix. ...

  8. KEGG下载某物种最新的版本信息(斑马鱼为例)

    步骤一:打开链接并选择物种 http://www.genome.jp/kegg-bin/get_htext?hsa00001+3101 步骤二:对文件进行解析 步骤三:统计信息 一级结构(6大类): ...

  9. Cause: org.xml.sax.SAXParseException; lineNumber: 45; columnNumber: 62; 元素内容必须由格式正确的字符数据或标记组成。

    三月 09, 2018 12:13:39 下午 org.apache.catalina.core.StandardContext listenerStart严重: Exception sending ...

  10. java &&与||短路的详解

    短路运算符就是我们常用的“&&”.“||”,一般称为“条件操作”. class Logic{    public ststic void main(String[] args){    ...