【POJ】1185 炮兵阵地(状压dp)
2024-09-03 05:44:01
题目
传送门: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 ;
}
最新文章
- python--基础学习(五)参数位置传递、关键字传递、包裹传递及解包裹
- return 关键字的作用
- Hierarchical Softmax
- Installing Hadoop on Mac OSX Yosemite Tutorial Part 1.
- uploadify 自动访问url 初始化 自动请求
- reporting service &; wpf
- hdu5443(2015长春赛区网络赛1007)暴力
- 三大文本处理工具grep、sed及awk的简单介绍
- shell echo打印换行的方法
- cleartool mkview snapshot windows
- ECMAScript 发展历史
- Linux性能统计工具
- ssh的public key的使用
- Sublime Text 2快捷键大全
- beforeunload
- .net反混淆脱壳工具de4dot的使用
- Python-CSS入门
- C#重点内容之:事件(Event)
- 8.C#知识点:委托和事件
- spark-shuffle分析
热门文章
- 利用Html.css OPPO手机导航菜单的制作解析
- 对于应用之间的调用,如何选择rpc还是mq?
- UVA-11082 Matrix Decompressing (网络流建模)
- [转载]c语言指针segmentation fault 指针常常错误的小地方
- DOM之一些小实验demo
- Life Cycle(JSF+Facelets)
- 选择语句=》OO函数实现
- CSS 中文字体的英文名称 (simhei, simsun) 宋体 微软雅黑等
- L3-014 周游世界 (30 分)
- 《DSP using MATLAB》Problem 2.14