[状压dp] 炮兵阵地(状压dp)
文章目录
- 0. 前言
- 1. 状压dp+棋盘式(基于连通性)
0. 前言
相关:
- [状压dp] 蒙德里安的梦想(模板题+状压dp)
强相关:
- [状压dp] 小国王(状压dp)
- [状压dp] 玉米田(状压dp)
1. 状压dp+棋盘式(基于连通性)
292. 炮兵阵地
[状压dp] 玉米田(状压dp) 是高度为 1 的十字形,本题是 高度为 2 的十字形。 那么状态转移就和前 2 层有关。且本题是求最大值,而非方案数。
思路:
- 状态定义:
f[i][j][k]
:摆放完前i
行,且第i-1
行摆放状态是j
,第i
行摆放状态是k
的所有摆放方案的最大值
- 状态计算:
假设第
i
行状态是b
,第i-1
行状态是a
,第i-2
行状态是c
当
((a&b) | (a&c) | (b&c)) = 0
则说明纵向不会出现冲突当
(g[i-1]&a | g[i]&b)=0
则说明炮兵在平地上。在此与的优先级高于或的优先级,不用加括号状态转移方程:
f[i][j][k] = max(f[i][j][k], f[i-1][c][j]+cnt[c])
- 时间复杂度: n∗2m∗2m∗2m=O(n23m)=100∗230=1011n*2^m*2^m*2^m=O(n2^{3m})=100*2^{30}=10^{11}n∗2m∗2m∗2m=O(n23m)=100∗230=1011 这个时间复杂度…但是里面合法状态很少…依旧可以过
滚动数组优化,不然空间直接爆炸。
重点还是在状态定义及状态计算上。这里状态定义记录了第 i
行状态为 k
、第 i-1
行状态为 j
。那么找到最后一个不一样的点就是第 i-2
行,所以就依据第 i-2
行进行状态划分即可。
代码:
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>using namespace std;const int N = 11, M = 1 << 10;int n, m;
int g[105];
vector<int> state;
int cnt[M];
int f[2][M][M]; // 使用滚动数组,后两维都已经100w了...bool check(int x) {for (int i = 0; i < m; ++i) // 针对列做状态压缩,同列三个不能有2个1if ((x >> i & 1) && ((x >> i + 1 & 1) | (x >> i + 2 & 1)))return false;return true;
}int count(int x) {int res = 0;for (int i = 0; i < m; ++i) res += x >> i & 1;return res;
}int main() {cin >> n >> m;for (int i = 1; i <= n; ++i)for (int j = 0; j < m; ++j) {char c; // 拿int类型读入char,读入全是0cin >> c;if (c == 'H')g[i] += 1 << j; // 二进制表示一行}for (int i = 0; i < 1 << m; ++i) if (check(i)) {state.push_back(i);cnt[i] = count(i);}for (int i = 1; i <= n + 2; ++i)for (int j = 0; j < state.size(); ++j) // j为第i-1行状态for (int k = 0; k < state.size(); ++k) // k为第i行状态for (int u = 0; u < state.size(); ++u) { // u为第i-2行状态int a = state[j], b = state[k], c = state[u];if ((a & b) | (b & c) | (a & c)) continue; if (g[i - 1] & a | g[i] & b) continue;f[i & 1][j][k] = max(f[i & 1][j][k], f[i - 1 & 1][u][j] + cnt[b]);}cout << f[n + 2 & 1][0][0] << endl;// 遍历写法,修改第一个 for (int i = 1; i <= n; ++i)/*int res = 0;for (int i = 0; i < state.size(); ++i) for (int j = 0; j < state.size(); ++j)res = max(res, f[n & 1][i][j]);cout << res << endl;*/return 0;
}
[状压dp] 炮兵阵地(状压dp)相关推荐
- POJ - 1185 炮兵阵地(状压dp)
题目链接:点击查看 题目大意:中文题,题意很清晰,不多赘述 题目分析:最基础的状压dp,需要考虑如何转移,因为每一个炸弹所涉及的范围都是上下左右两个格子,我们可以从第一行开始向下转移,这样某一行的状态 ...
- POJ 1185 炮兵阵地 (状压DP)
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 14869 Accepted: 5575 Description ...
- POJ1185 炮兵阵地 状压DP
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 31819 Accepted: 12295 Descriptio ...
- POJ 1185 炮兵阵地(状态压缩DP)
Description 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用&quo ...
- 玉米田 炮兵阵地 状态压缩DP
玉米田 原题 #include <cstring> #include <iostream> #include <algorithm> #include <ve ...
- POJ1185炮兵阵地(状态压缩 + dp)
题目链接 题意:给出一张n * m的地图,其中 有的地方能放大炮,有的地方不能,大炮与上下左右两个单位范围内会相互攻击,问最多能放几个大炮 能放大炮为1不能放大炮为0,把每一行看做一个状态,要除去同一 ...
- 洛谷P2704 [NOI2001]炮兵阵地(状压dp)
题目描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P&quo ...
- P2704 炮兵阵地 (状压dp入门题) 题解
题意简述:给定一个大小为n*m的棋盘,棋盘上'H'表示不可放置,'P'表示可放置,一个棋子在棋盘上的攻击范围是其左右上下2格以内,求不冲突情况下的最多摆放棋子数. 分析:决策是对于一个P格子考虑放或不 ...
- POJ 1185 炮兵阵地 状压dp
http://poj.org/problem?id=1185 经典题目不必多说,直接贴代码. 1 #include<cstdio> 2 #include<cstring> 3 ...
- 状压dp之二之三 炮兵阵地/玉米田 By cellur925
一.简单的状压dp 玉米田 题目描述 Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ ...
最新文章
- TF:tensorflow框架中常用函数介绍—tf.Variable()和tf.get_variable()用法及其区别
- Linux系统新建用户用ssh远程登陆显示-bash-4.1$
- 面向对象发牌Java_面向对象思路的斗地主发牌小程序
- 查看oracle监听服务状态,(总结)Oracle监听服务lsnrctl参数及查询状态详解
- 【Ubuntu-opencv3.4.0-Error】对‘cv::Mat::updateContinuityFlag()’未定义的引用
- Linux 嵌入式启动以及优化(Z)
- 微信功能“拍一拍”,都有谁在“拍”你?
- 仿iphone触屏手机界面
- linux防火墙测试,构建基于ipchains的Linux防火墙
- win10安装时有个修复计算机,win10出现故障,在安全模式下安装Windows更新,彻底修复问题...
- 计算机智能测试与机电工程学,机电工程学院智能技术创新团队论文被国际计算机视觉顶级会议ICCV录用...
- 英1数1专业课408计算机考研312分,408计算机考研复习经验:各个突破全面掌握
- 探访新疆北部主力气田:推陈出新 “新科技”保供气
- python复制mysql表_MySQL中表的复制以及大型数据表的备份教程
- 软考高级 真题 2017年下半年 信息系统项目管理师 论文
- C++20 标准正式发布,命名为 ISO/IEC 14882:2020。
- 知识竞赛软件已全面取代了传统手工赛场控制方式
- h5扫描pc端二维码登录
- 操作系统应用阶层现状,对操作系统的认识
- FREEIPA:ipa-server的部署使用
热门文章
- 慧荣SM2258XT+B17颗粒,固态硬盘无法格式化已开卡成功,经验分享+量产工具,SM2259XT2类似
- PAT乙级刷题感想及踩坑总结
- 计算机学的是苹果系统,苹果电脑装windows7教程 苹果电脑装windows7方法
- 开源项目halo个人博客源码学习初篇(一)
- BUUCTF_Misc(后续更新....)
- 基于QT的超市信息管理系统
- 更新sqlmap1.5.5版本教程(附带下载地址)
- python播放音乐同步歌词_Python零基础学习代码实践 —— 模拟播放器中的歌词显示...
- 苹果cmsV10资源站模板
- 蓝天模具风扇调速软件_联力UNI FAN SL120风扇体验:模组化拼装的风扇