题目:

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. NLP中的预训练语言模型(五)—— ELECTRA

    这是一篇还在双盲审的论文,不过看了之后感觉作者真的是很有创新能力,ELECTRA可以看作是开辟了一条新的预训练的道路,模型不但提高了计算效率,加快模型的收敛速度,而且在参数很小也表现的非常好. 论文: ...

  2. linux(10)uwsgi???

    [uwsgi] Django-related settings the base directory (full path) #指定项目的绝对路径的第一层路径!!!!!!!!!!!!!!!!!!!!! ...

  3. 201871010106-丁宣元 《面向对象程序设计(java)》第十五周学习总结

    201871010106-丁宣元 <面向对象程序设计(java)>第十五周学习总结 正文开头: 项目 内容 这个作业属于哪个课程 https://home.cnblogs.com/u/nw ...

  4. 201871010125 王玉江《面向对象程序设计(java)》第十三周学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...

  5. 201871010128-杨丽霞《面向对象程序设计(Java)》第十一周学习总结

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

  6. git fatal: remote origin already exists错误解决方案

    $ git remote add origin git@github.com:AntonioSu/learngitWindows.git 在运行以上代码出现的错误,此错误是因为已经存在了远程分支,只需 ...

  7. SLAM:

    十四讲: 传感器约束了外部环境 测到的通常都是一些间接的物理量而不是直接的位置数据 只能通过一些间接的手段,从这些数据推算自己的位置 好处是没有对环境提出任何要求 camera:单目.双目.深度 Mo ...

  8. 【PL/SQL】PLSQL Developer注册码

    [12.0.7] product code: 4vkjwhfeh3ufnqnmpr9brvcuyujrx3n3le serial Number:226959 password: xs374ca

  9. AcWing 91. 最短Hamilton路径

    今天第一次在\(AcWing\)这个网站上做题,来发一下此网站的第一篇题解 传送门 思路 直接枚举的话时间复杂度为\(O(n*n!)\) 复杂度显然爆炸,所以我们用二进制枚举,这样就可以把复杂度降到\ ...

  10. [LeetCode] 277. Find the Celebrity 寻找名人

    Suppose you are at a party with n people (labeled from 0 to n - 1) and among them, there may exist o ...