题目链接

  话说还真没见过能影响两行的状压。想了半天想出来f数组再多一维就能表示,但是没想到怎么才能不爆空间……

  也是从这道题里学到的一个妙招。

  可以把合法状态存到一个数组里,然后用数组下标来映射状态。感觉好强啊

  然后……这题差不多就完了。

  

#include<cstdio>
#include<cctype>
#include<algorithm>
inline long long read(){
long long num=,f=;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') f=-;
ch=getchar();
}
while(isdigit(ch)){
num=num*+ch-'';
ch=getchar();
}
return num*f;
} inline int getlen(int x){
int ans=;
while(x){
if(x&) ans++;
x>>=;
}
return ans;
} int f[][][];
int s[],w[],cnt;
int state[];
int Ans;
int main(){
int n=read(),m=read();
int Max=(<<m)-;
for(int i=;i<=n;++i){
char c[];
scanf("%s",c+);
for(int j=;j<=m;++j){
state[i]=state[i]<<;
if(c[j]=='H') state[i]++;
}
}
for(int i=;i<=Max;++i){
if(i&(i>>)||i&(i>>)) continue;
s[++cnt]=i;
w[cnt]=getlen(i);
if(!(state[]&i)) f[][cnt][]=w[cnt];
}
for(int i=;i<=cnt;++i)
for(int j=;j<=cnt;++j){
if(s[i]&s[j]||state[]&s[i]||state[]&s[j]) continue;
f[][i][j]=w[i]+w[j];
}
for(int i=;i<=n;++i)
for(int j=;j<=cnt;++j){
if(state[i]&s[j]) continue;
for(int k=;k<=cnt;++k){
int ans=;
if((state[i-]&s[k])||(s[j]&s[k])) continue;
for(int l=;l<=cnt;++l){
if((state[i-]&s[l])||(s[j]&s[l])||(s[k]&s[l])) continue;
ans=std::max(ans,f[i-][k][l]);
}
f[i][j][k]=ans+w[j];
}
}
for(int i=;i<=cnt;++i)
for(int j=;j<=cnt;++j) Ans=std::max(Ans,f[n][i][j]);
printf("%d",Ans);
return ;
}

【Luogu】P2704炮兵阵地(状压DP)的更多相关文章

  1. luogu 2704 炮兵阵地 状压dp

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

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

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

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

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

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

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

  5. P2704 [NOI2001]炮兵阵地 (状压DP)

    题目: P2704 [NOI2001]炮兵阵地 解析: 和互不侵犯一样 就是多了一格 用\(f[i][j][k]\)表示第i行,上一行状态为\(j\),上上行状态为\(k\)的最多的可以放的炮兵 发现 ...

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

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

  7. POJ 1185 炮兵阵地 状压dp

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

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

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

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

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

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

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

随机推荐

  1. GCD 使用说明

    GCD提供的一些操作队列的方法 名称 说明 dispatch_set_target_queue 将多个队列添加到目标队列中 dispatch_group 将多个队列放入组中,监听所有任务完成状 dis ...

  2. sublime快捷键mark

    Ctrl+D 选词 (反复按快捷键,即可继续向下同时选中下一个相同的文本进行同时编辑)Ctrl+G 跳转到相应的行Ctrl+J 合并行(已选择需要合并的多行时)Ctrl+L 选择整行(按住-继续选择下 ...

  3. gunzip

    gunzip——解压缩.gz的压缩文件 GNU unzip 命令所在路径:/bin/gunzip 示例1: # gunzip services.gz 解压缩当前目录下的services.gz文件,执行 ...

  4. iPhone开发小工具

    1.AppIcon: 可以瞬间把图片转换为应用所需要的Icon(Icon-72.png,Icon-72@2x.png,......iTunesArtwork@2x)   2.Resizer: 方便把- ...

  5. ubuntu 14.04 离线部署docker

    hett@hett-virtual-machine:~$ lsb_release -aNo LSB modules are available.Distributor ID:    UbuntuDes ...

  6. 网络大牛如何回答Chrome的15个刁钻面试题?

    (内容来自网络整理) Google的面试题在刁钻古怪方面相当出名,甚至已经有些被神化的味道.这里整理出15道Google面试题并一一给出了网络大牛的答案,其中不少都是流传很广的. 第1题:让你清洗西雅 ...

  7. Hdoj—1789

    //大意理解 先排序 最早交的里面选最大值 扫描完了加没写的 排序后 应该是早交的和扣分多的在前 用结构体吧/*#include<stdio.h>#include<stdio.h&g ...

  8. WPF知识点全攻略02- WPF体系结构

    WPF体系结构图: PersentationFramework.dll包含WPF顶层的类型,包括哪些表示窗口.面板以及其他类型控件的类型.他还实现了高层编程抽象,如样式.开发人员直接使用的大部分类都来 ...

  9. ValueError: option names {'--alluredir'} already added 报错

    运行测试用例 import pytest from WXP2P_2.test_data2.login_case import logindata_error1,logindata_error2,log ...

  10. webpack devserver的说明

    一般我们在项目中 如果用webpack的话,基本都会用到webpack-dev-server,配置大致如下: devServer={ contentBase: basePath, historyApi ...