292. 炮兵阵地 - AcWing题库

分析:

限制条件

  • 考虑上下           同一列两格内不能放        不能 (x>>i&1) && ((x>>(i+1)&1) || (x>>(i+2)&1))
  • 考虑左右           同一行两格内不能放        要满足 (a&c|a&b|c&b)==0
  • 只能在平原上面放

状态表示:已经摆放完前i-1,且第i-2行与第i-1行 第i行 都满足限制条件,且第i行的摆放状态为j,第i-1行摆放状态为k的最多炮兵数

递推方式: 0~1<<m

属性:max

状态计算/子集划分:子集应该是前面所有合法的集合

由于两格内不能连续摆放,所以要记录 i行 ,i-1行 , i-2 行 三行内的所有摆放状态,但是记录三行会超出空间,所以我们只需要记录i-1行和i行就可以了,i-2行可以在dp[i-1][j][k]中表示出来

因为最后还可能会超出空间,于是选择使用滚动数组的方法  dp[i&1]...

#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
using namespace std;
const int N=3,M=(1<<10)+10;
int dp[N][M][M];
int n,m;
int g[110];
vector<int> state;
int cnt[M];
bool check(int x)
{for(int i=0;i<m;i++)if((x>>i&1))if((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 a;cin>>a;g[i]+=(a=='H')?1<<j:0;}   dp[0][0][0]=0;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;i++)for(int j=0;j<state.size();j++)for(int k=0;k<state.size();k++){int a=state[j],b=state[k];for(auto c:state){if(a&b|a&c|b&c) continue;if((g[i]&a)||(g[i-1]&b)) continue;dp[i&1][a][b]=max(dp[i&1][a][b],dp[(i-1)&1][b][c]+count(a));}}int res=0;for(auto a:state)for(auto b:state)res=max(res,dp[n&1][a][b]);cout<<res;return 0;
}

292.炮兵阵地(棋盘类状压dp)相关推荐

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

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

  2. NYOJ 81:炮兵阵地(状压DP)

    炮兵阵地 时间限制:2000 ms  |  内存限制:65535 KB 难度:6 描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地 ...

  3. 刷题周记(九)——#状压DP:最短Hamilton路径、小国王(互不侵犯)、玉米田(Corn Fields G)、愤怒的小鸟、吃奶酪、炮兵阵地、宝藏 #区间DP:清空字符串#DP:关灯问题II

    文章目录 --2020年12月20日(周日)------------------ 状压DP 一.最短Hamilton路径(模板题) 二.玉米田(P1879 [USACO06NOV]Corn Field ...

  4. POJ 1185 炮兵阵地 【状压DP】

    <题目链接> 题目大意: 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平 ...

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

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

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

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

  7. BZOJ 4000: [TJOI2015]棋盘( 状压dp + 矩阵快速幂 )

    状压dp, 然后转移都是一样的, 矩阵乘法+快速幂就行啦. O(logN*2^(3m)) ------------------------------------------------------- ...

  8. POJ 1321 棋盘问题(DFS 状压DP)

    用DFS写当然很简单了,8!的复杂度,16MS搞定. 在Discuss里看到有同学用状态压缩DP来写,就学习了一下,果然很精妙呀. 状态转移分两种,当前行不加棋子,和加棋子.dp[i][j]中,i代表 ...

  9. 状压DP学习总结 (详解,适合没状压dp基础的人学习,还在更新中,,,,)

    本次博客,主要是给学弟学妹们讲解一下状压dp,不适合有基础的同学观看,可能会浪费时间,因为偏基础 先来最简单的一个吧   http://acm.hdu.edu.cn/showproblem.php?p ...

最新文章

  1. window下git的使用
  2. Exynos4412 中断驱动开发(三)—— 设备树中中断节点的创建
  3. 53pagecontext对象
  4. Magento 1.9.X 系列教程
  5. js 判断图片是否加载完成
  6. (转载)JavaWeb学习总结(五十二)——使用JavaMail创建邮件和发送邮件
  7. android flash游戏播放器代码,新flashplayer游戏播放器apk-新Flash游戏播放器(NEW Server Mode)预约V4.2安卓版-西西软件园...
  8. Python学习实验报告(1)
  9. java的视频案例教学 值得下载
  10. keil5库文件安装失败_iPad iPhone如何清理垃圾 iPad iPhone清理垃圾文件办法【详解】...
  11. 我的【藏羚头条】开发运营经验
  12. 基于Java+Swing实现天气预报系统
  13. 公链蓬勃发展——多链世界从理想走向现实 | 2021 区块链年报|Footprint Analytics
  14. 这所年轻大学,被誉为中国离科学最近的大学!
  15. 电脑开机后电脑连接正常几分钟后网络连接失败
  16. 【基于matlab的mqam调制与解调系统】
  17. 深度学习中,人们常说的鲁棒性和泛化性是什么意思?通俗的给你解释清楚,一看你就明白了。
  18. Linner和WebStorm前端开发环境搭建
  19. 矩阵论基础知识5(病态矩阵与条件数 )
  20. unknown error: Element <div data-v-41264f4a=““ class点击标签会返回新页面数据的获取对应数据的正确做法

热门文章

  1. 生意是真的不好做,办卡是真的风险特别大!
  2. electron 无法复制粘贴问题
  3. Apple ID 密码规则
  4. 韩译中难吗,如何做好韩语翻译
  5. java 获取bean_spring如何获取bean的6种方法,你知道几个?
  6. 树莓派网络监控(官方64位系统+docker+motioneye+内网穿透)
  7. php json 驼峰 下划线,Go语言json编码驼峰转下划线、下划线转驼峰
  8. vue自定义指令之手写v-loading指令
  9. 2017福州大学面向对象程序设计课程作业六
  10. linux 如何查看端口被哪个进程占用,如何查看linux端口被哪个进程占用