文章目录

  • 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)相关推荐

  1. POJ - 1185 炮兵阵地(状压dp)

    题目链接:点击查看 题目大意:中文题,题意很清晰,不多赘述 题目分析:最基础的状压dp,需要考虑如何转移,因为每一个炸弹所涉及的范围都是上下左右两个格子,我们可以从第一行开始向下转移,这样某一行的状态 ...

  2. POJ 1185 炮兵阵地 (状压DP)

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

  3. POJ1185 炮兵阵地 状压DP

    炮兵阵地 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 31819   Accepted: 12295 Descriptio ...

  4. POJ 1185 炮兵阵地(状态压缩DP)

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

  5. 玉米田 炮兵阵地 状态压缩DP

    玉米田 原题 #include <cstring> #include <iostream> #include <algorithm> #include <ve ...

  6. POJ1185炮兵阵地(状态压缩 + dp)

    题目链接 题意:给出一张n * m的地图,其中 有的地方能放大炮,有的地方不能,大炮与上下左右两个单位范围内会相互攻击,问最多能放几个大炮 能放大炮为1不能放大炮为0,把每一行看做一个状态,要除去同一 ...

  7. 洛谷P2704 [NOI2001]炮兵阵地(状压dp)

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

  8. P2704 炮兵阵地 (状压dp入门题) 题解

    题意简述:给定一个大小为n*m的棋盘,棋盘上'H'表示不可放置,'P'表示可放置,一个棋子在棋盘上的攻击范围是其左右上下2格以内,求不冲突情况下的最多摆放棋子数. 分析:决策是对于一个P格子考虑放或不 ...

  9. POJ 1185 炮兵阵地 状压dp

    http://poj.org/problem?id=1185 经典题目不必多说,直接贴代码. 1 #include<cstdio> 2 #include<cstring> 3 ...

  10. 状压dp之二之三 炮兵阵地/玉米田 By cellur925

    一.简单的状压dp 玉米田 题目描述 Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ ...

最新文章

  1. TF:tensorflow框架中常用函数介绍—tf.Variable()和tf.get_variable()用法及其区别
  2. Linux系统新建用户用ssh远程登陆显示-bash-4.1$
  3. 面向对象发牌Java_面向对象思路的斗地主发牌小程序
  4. 查看oracle监听服务状态,(总结)Oracle监听服务lsnrctl参数及查询状态详解
  5. 【Ubuntu-opencv3.4.0-Error】对‘cv::Mat::updateContinuityFlag()’未定义的引用
  6. Linux 嵌入式启动以及优化(Z)
  7. 微信功能“拍一拍”,都有谁在“拍”你?
  8. 仿iphone触屏手机界面
  9. linux防火墙测试,构建基于ipchains的Linux防火墙
  10. win10安装时有个修复计算机,win10出现故障,在安全模式下安装Windows更新,彻底修复问题...
  11. 计算机智能测试与机电工程学,机电工程学院智能技术创新团队论文被国际计算机视觉顶级会议ICCV录用...
  12. 英1数1专业课408计算机考研312分,408计算机考研复习经验:各个突破全面掌握
  13. 探访新疆北部主力气田:推陈出新 “新科技”保供气
  14. python复制mysql表_MySQL中表的复制以及大型数据表的备份教程
  15. 软考高级 真题 2017年下半年 信息系统项目管理师 论文
  16. C++20 标准正式发布,命名为 ISO/IEC 14882:2020。
  17. 知识竞赛软件已全面取代了传统手工赛场控制方式
  18. h5扫描pc端二维码登录
  19. 操作系统应用阶层现状,对操作系统的认识
  20. FREEIPA:ipa-server的部署使用

热门文章

  1. 慧荣SM2258XT+B17颗粒,固态硬盘无法格式化已开卡成功,经验分享+量产工具,SM2259XT2类似
  2. PAT乙级刷题感想及踩坑总结
  3. 计算机学的是苹果系统,苹果电脑装windows7教程 苹果电脑装windows7方法
  4. 开源项目halo个人博客源码学习初篇(一)
  5. BUUCTF_Misc(后续更新....)
  6. 基于QT的超市信息管理系统
  7. 更新sqlmap1.5.5版本教程(附带下载地址)
  8. python播放音乐同步歌词_Python零基础学习代码实践 —— 模拟播放器中的歌词显示...
  9. 苹果cmsV10资源站模板
  10. 蓝天模具风扇调速软件_联力UNI FAN SL120风扇体验:模组化拼装的风扇