P2704 [NOI2001]炮兵阵地 (状压DP)
题目:
解析:
和互不侵犯一样
就是多了一格
用\(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)的更多相关文章
- 洛谷P2704 [NOI2001]炮兵阵地 [状压DP]
题目传送门 炮兵阵地 题目描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图 ...
- [NOI2001]炮兵阵地 状压DP
题面: 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图.在每一格平原地形上最多 ...
- [POJ1185][NOI2001]炮兵阵地 状压DP
题目链接:http://poj.org/problem?id=1185 很裸的状压,考虑对于一行用二进制储存每一种的状态,但是状态太多了做不了. 观察到有很多状态都是不合法的,于是我们预处理出合法的状 ...
- TZOJ 4912 炮兵阵地(状压dp)
描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P" ...
- POJ1185 炮兵阵地 —— 状压DP
题目链接:http://poj.org/problem?id=1185 炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions ...
- poj - 1185 炮兵阵地 状压DP 解题报告
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 21553 Accepted: 8363 Description ...
- luogu 2704 炮兵阵地 状压dp
状压的基础题吧 第一次看感觉难上天,后来嘛就.. 套路:先根据自身状态筛出可行状态,再根据地图等其他限制条件筛选适合的状态加入答案 f i,j,k 分别代表 行数,本行状态,上行状态,再累加答案即可 ...
- POJ 1185 炮兵阵地 状压dp
题目链接: http://poj.org/problem?id=1185 炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K 问题描述 司令部的将军们打算在N*M ...
- 炮兵阵地 /// 状压DP oj26314
题目大意: 炮兵阵地 设置炮兵的位置 其上两位 下两位 左两位 右两位 不能同时设置炮兵 这题是 corn fields玉米地 的升级版 可以先看下这题的注释 更详细些 第一种方法是网上大多数题解的解 ...
随机推荐
- NLP中的预训练语言模型(五)—— ELECTRA
这是一篇还在双盲审的论文,不过看了之后感觉作者真的是很有创新能力,ELECTRA可以看作是开辟了一条新的预训练的道路,模型不但提高了计算效率,加快模型的收敛速度,而且在参数很小也表现的非常好. 论文: ...
- linux(10)uwsgi???
[uwsgi] Django-related settings the base directory (full path) #指定项目的绝对路径的第一层路径!!!!!!!!!!!!!!!!!!!!! ...
- 201871010106-丁宣元 《面向对象程序设计(java)》第十五周学习总结
201871010106-丁宣元 <面向对象程序设计(java)>第十五周学习总结 正文开头: 项目 内容 这个作业属于哪个课程 https://home.cnblogs.com/u/nw ...
- 201871010125 王玉江《面向对象程序设计(java)》第十三周学习总结
项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...
- 201871010128-杨丽霞《面向对象程序设计(Java)》第十一周学习总结
201871010128-杨丽霞<面向对象程序设计(Java)>第十一周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...
- git fatal: remote origin already exists错误解决方案
$ git remote add origin git@github.com:AntonioSu/learngitWindows.git 在运行以上代码出现的错误,此错误是因为已经存在了远程分支,只需 ...
- SLAM:
十四讲: 传感器约束了外部环境 测到的通常都是一些间接的物理量而不是直接的位置数据 只能通过一些间接的手段,从这些数据推算自己的位置 好处是没有对环境提出任何要求 camera:单目.双目.深度 Mo ...
- 【PL/SQL】PLSQL Developer注册码
[12.0.7] product code: 4vkjwhfeh3ufnqnmpr9brvcuyujrx3n3le serial Number:226959 password: xs374ca
- AcWing 91. 最短Hamilton路径
今天第一次在\(AcWing\)这个网站上做题,来发一下此网站的第一篇题解 传送门 思路 直接枚举的话时间复杂度为\(O(n*n!)\) 复杂度显然爆炸,所以我们用二进制枚举,这样就可以把复杂度降到\ ...
- [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 ...