题目:

P2704 [NOI2001]炮兵阵地

解析:

和互不侵犯一样

就是多了一格

用\(f[i][j][k]\)表示第i行,上一行状态为\(j\),上上行状态为\(k\)的最多的可以放的炮兵

发现\(100\times 1024\times 1024\)开不下

还是通过简单的搜索发现就算\(m==10\)时合法的状态只有\(60\)种

\(100\times 60\times 60\)就没问题了

然后就和互不侵犯一样,枚举状态就可以了

状态转移

\(f[i][j][k] = max\{f[i][j][k], f[i-1][k][l]+sum[state[i]]\}\)

\(sum[i]\)表示\(i\)状态中有多少个\(1\)

代码:

#include <bits/stdc++.h>
using namespace std;
const int N = 110; int n, m, num, ans = -0x3f3f3f3f;
int state[N], sum[1050], line[N], f[N][N][N]; char s[N]; int qpow(int a, int b) {
int ans = 1;
while (b) {
if (b & 1) ans = ans * a;
a *= a, b >>= 1;
}
return ans;
} int main() {
cin >> n >> m;
for (int i = 1; i <= n; ++i) {
cin >> s;
for (int j = m - 1; j >= 0; --j)
if (s[j] == 'P') line[i] += qpow(2, m - j - 1);
}
for (int i = 0; i < (1 << m); ++i) {
if ((i & (i << 1)) || (i & (i >> 1)) ||
(i & (i << 2)) || (i & (i >> 2))) continue;
state[++num] = i;
sum[i] = __builtin_popcount(i);
}
for (int i = 1; i <= num; ++i)
if ((state[i] | line[1]) == line[1])
f[1][i][1] = sum[state[i]];
for (int i = 2; i <= n; ++i)
for (int j = 1; j <= num; ++j)
if ((state[j] | line[i]) == line[i])
for (int k = 1; k <= num; ++k)
if ((state[k] | line[i - 1]) == line[i - 1] && !(state[j] & state[k]))
for (int l = 1; l <= num; ++l)
if (!(state[l] & state[k]) &&
!(state[l] & state[j]) &&
(state[l] | line[i - 2]) == line[i - 2])
f[i][j][k] = max(f[i][j][k], f[i - 1][k][l] + sum[state[j]]);
for (int i = 1; i <= num; ++i)
for (int j = 1; j <= num; ++j)
ans = max(ans, f[n][i][j]);
cout << ans;
}

P2704 [NOI2001]炮兵阵地 (状压DP)的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

  7. luogu 2704 炮兵阵地 状压dp

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

  8. POJ 1185 炮兵阵地 状压dp

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

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

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

随机推荐

  1. 解析YAML文件

    YamlMapFactoryBean yamlMapFactoryBean = new YamlMapFactoryBean(); yamlMapFactoryBean.setResources(ne ...

  2. 201871010123-吴丽丽《面向对象程序设计(Java)》第十五周学习总结

    201871010123-吴丽丽<面向对象程序设计(Java)>第十五周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...

  3. 201871010118-唐敬博《面向对象程序设计(java)》第十周学习总结

    博文正文开头格式:(2分) 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.co ...

  4. oracle查看被锁的表及解除锁

    -- 查看被锁对象 select object_name,machine,s.sid,s.serial# from v$locked_object l,dba_objects o ,v$session ...

  5. python预科前三天:计算器知识、Python下载和安装、Pycharm下载安装激活设置、解释型和编译型、git、思维导图、显示隐藏文件、隐藏已知文件扩展名、创建组织、创建项目、提交作业、排BUG技巧

    1.计算机组成结构:CPU.硬盘.内存.输入输出设备.主板.电源. 2.硬件之间的协作关系:是CPU运算完后给操作系统.专业术语叫指令. 3.键盘输入a之后发生的事情:键盘-CPU-操作系统-显卡-显 ...

  6. Java编译期与运行期

    编译期:是指把源码交给编译器编译成计算机可以执行的文件的过程.在Java中也就是把Java代码编成class文件的过程.编译期只是做了一些翻译功能,并没有把代码放在内存中运行起来,而只是把代码当成文本 ...

  7. JDOJ 1790: 高精度A-B

    JDOJ 1790: 高精度A-B JDOJ传送门 洛谷 P2142 高精度减法 洛谷传送门 题目描述 高精度减法 输入格式 两个整数a,b(第二个可能比第一个大) 输出格式 结果(是负数要输出负号) ...

  8. LG5201 「USACO2019JAN」Shortcut 最短路树

    \(\mathrm{Shortcut}\) 问题描述 LG5201 题解 最短路树. 显然奶牛的路径就是从\(1\)走到各个草地,于是从\(1\)跑最短路,构建最短路树. 为了保证字典序,从\(1\) ...

  9. LG2893/POJ3666 「USACO2008FEB」Making the Grade 线性DP+决策集优化

    问题描述 LG2893 POJ3666 题解 对于\(A\)中的每一个元素,都将存在于\(B\)中. 对\(A\)离散化. 设\(opt_{i,j}\)代表\([1,i]\),结尾为\(j\)的最小代 ...

  10. LG2447/BZOJ1923 「SDOI2010」外星千足虫 高斯消元

    问题描述 LG2447 BZOJ1923 题解 显然是一个高斯消元,但是求的东西比较奇怪 发现这个方程组只关心奇偶性,于是可以用一个\(\mathrm{bitset}\)进行优化,用xor来进行消元操 ...