【POJ】1185 炮兵阵地(状压dp)
题目
传送门:QWQ
分析
看到$ M<=10 $考虑状压。
然后把每行都压一下,那么每个状态相关的就是上一行和上上行的状态。
然后枚举。
然后复杂度最坏是$ O(100 \times 1024^3) $的
仔细分析一下,有很多状态是无用的,但还是被判断了,比如$ 11111 $,显然不能做到不误伤。
那么我们把所有可能的状态拉出来(据说小于70?),即代码中的$ st $数组
然后用$ dp[i][j][k] $ 表示前i行上行状态st[j]本行状态st[k]的最大炮兵数量
然后就可以通过上行和上上行很快的更新了
最后统计答案时把最后一行每个位置都要算一下。
代码
- #include <cstdio>
- #include <algorithm>
- using namespace std;
- const int maxn=;
- int all[maxn], dp[][][], num[];
- int ans=-1e9, ks=, n, m, st[maxn], sum[maxn], cnt;
- char map[maxn][maxn];
- int main(){
- scanf("%d%d",&n,&m);
- for(int i=;i<=n;i++){
- scanf("%s",map[i]);
- for(int j=;j<m;j++){
- if(map[i][j]=='H') all[i]|=(<<j);
- }
- }
- for(int i=;i<=;i++){
- for(int j=i;j;j>>=) if(j%) num[i]++;
- }
- for(int i=;i<(<<m);i++) //预处理出一行可能的状态
- if(!(i&(i<<)) && !(i&(i<<))) st[++cnt]=i,sum[cnt]=num[i];
- for(int i=;i<=cnt;i++) if(!(st[i]&all[])) dp[][][i]=sum[i];
- int ans=;
- //dp[i][j][k]前i行上行状态st[j]本行状态st[k]
- for(int i=;i<n;i++){
- for(int j=;j<=cnt;j++){
- for(int k=;k<=cnt;k++){
- if(st[j]&st[k]) continue;
- for(int l=;l<=cnt;l++){
- if(!(st[j]&st[l])&&!(st[k]&st[l])&&!(st[l]&all[i+])){
- dp[i+][k][l]=max(dp[i+][k][l], dp[i][j][k]+sum[l]);
- }
- }
- }
- }
- }
- for(int i=;i<=cnt;i++)
- for(int j=;j<=cnt;j++)
- ans=max(ans,dp[n][i][j]);
- printf("%d",ans);
- return ;
- }
【POJ】1185 炮兵阵地(状压dp)的更多相关文章
- POJ 1185 炮兵阵地 状压dp
题目链接: http://poj.org/problem?id=1185 炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K 问题描述 司令部的将军们打算在N*M ...
- POJ 1185炮兵阵地 (状压DP)
题目链接 POJ 1185 今天艾教留了一大堆线段树,表示做不动了,就补补前面的题.QAQ 这个题,我第一次写还是像前面HDU 2167那样写,发现这次影响第 i 行的还用i-2行那样,那以前的方法就 ...
- poj - 1185 炮兵阵地 状压DP 解题报告
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 21553 Accepted: 8363 Description ...
- [poj 1185] 炮兵阵地 状压dp 位运算
Description 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用&quo ...
- POJ1185 炮兵阵地 —— 状压DP
题目链接:http://poj.org/problem?id=1185 炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions ...
- TZOJ 4912 炮兵阵地(状压dp)
描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P" ...
- 洛谷P2704 [NOI2001]炮兵阵地 [状压DP]
题目传送门 炮兵阵地 题目描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图 ...
- [POJ1185][NOI2001]炮兵阵地 状压DP
题目链接:http://poj.org/problem?id=1185 很裸的状压,考虑对于一行用二进制储存每一种的状态,但是状态太多了做不了. 观察到有很多状态都是不合法的,于是我们预处理出合法的状 ...
- luogu 2704 炮兵阵地 状压dp
状压的基础题吧 第一次看感觉难上天,后来嘛就.. 套路:先根据自身状态筛出可行状态,再根据地图等其他限制条件筛选适合的状态加入答案 f i,j,k 分别代表 行数,本行状态,上行状态,再累加答案即可 ...
- [NOI2001]炮兵阵地 状压DP
题面: 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图.在每一格平原地形上最多 ...
随机推荐
- BZOJ 2342: 【SHOI2011】 双倍回文
题目链接:双倍回文 回文自动机第二题.构出回文自动机,那么一个回文串是一个“双倍回文”,当且仅当代表这个串的节点\(u\)顺着\(fail\)指针往上跳,可以找到一个节点\(x\)满足\(2len_x ...
- Bert学习资料
首先是Bert的论文和 attention is all you need的论文 然后是:将nlp预训练 迁移学习的发展从word2vec 到elmo bert https://mp.weixin.q ...
- PHPUnit简介及使用(thinkphp5的单元测试安装及使用)
PHPUnit简介及使用(thinkphp5的单元测试安装及使用) 一.总结 一句话总结:直接google这个phpunit(how to use phpunit),然后去官网看使用样例和手册,那些英 ...
- Linux下,EPM11.1.1.3 configurator 不能启动AdminServer
需要测试环境, 安装EPM11.1.1.3 到 CentOS 5.6 在运行configurator(/app/hyperion/common/config/9.5.0.0 时, 卡在[Startin ...
- docker 安装mysql mongo
Docker安装Mysql 1.拉取镜像 docker pull mysql/mysql-server 2.运行mysql docker run -d -p : --name [Name] [Imag ...
- Linux 的 Out-of-Memory (OOM) Killer
同事在 Linux 服务器上遇到点小问题,我也上去折腾半天.这还是第一次注意到 Linux 这个多年来就存在的特性:OOM Killer .说白了 OOM Killer 就是一层保护机制,用于避免 L ...
- 2018.12.20 L195
Every Brazilian, including current and former members of the armed forces, will have to compromise u ...
- pandas 之 concat
本文摘自:http://pandas.pydata.org/pandas-docs/stable/merging.html 前提: ide: liuqian@ubuntu:~$ ipython 准备: ...
- 转: android之虚拟机访问tomcat服务器资源
最近在研究Android虚拟机访问tomcat服务器资源,所以找了个时间写下这篇博客和大家分享一下心得. 其实Android虚拟机访问tomcat服务器非常的简单,只要不要弄错IP地址就可以访问tom ...
- 怎么定位bug
测试发现bug,怎么定位?不同领域不同的测试对象,具体定位方法都不一样.自己定位bug的方法通常是以下过程: 1.发现bug,首先要查看bug的详细信息,根据描述初步分析是哪个模块哪段代码的问题 2. ...