[luoguP2704] 炮兵阵地(状压DP)
可以事先把每一行的所有状态处理出来,发现每一行的状态数最多不超过60个
f[i][j][k]表示前i行,第i行为状态j,第i-1行为状态k的最优解
#include <vector>
#include <cstdio>
#define N 101
#define max(x, y) ((x) > (y) ? (x) : (y)) int n, m, ans;
char map[N][N];
std::vector <int> S[N], cnt[N];
int f[N][N][N];
//f[i][j][k]表示前i行,第i行为状态j,第i-1行为状态k的最优解 inline void dfs(int s, int c, int last, int k)
{
int i;
S[k].push_back(s);
cnt[k].push_back(c);
for(i = last + 1; i <= m; i++)
if(map[k][i] != 'H' && !(s & (1 << i - 1)) && (!(s & (1 << i - 2)) || i == 1))
dfs(s | (1 << i), c + 1, i, k);
} int main()
{
int i, j, k, l;
scanf("%d %d", &n, &m);
for(i = 1; i <= n; i++) scanf("%s", map[i] + 1);
for(i = 1; i <= n; i++) dfs(0, 0, 0, i);
for(i = 0; i < S[1].size(); i++) f[1][i][0] = cnt[1][i];
for(i = 0; i < S[2].size(); i++)
for(j = 0; j < S[1].size(); j++)
if(!(S[1][j] & S[2][i]))
f[2][i][j] = max(f[2][i][j], f[1][j][0] + cnt[2][i]);
for(i = 3; i <= n; i++)
for(j = 0; j < S[i].size(); j++)
for(k = 0; k < S[i - 1].size(); k++)
for(l = 0; l < S[i - 2].size(); l++)
if(!(S[i][j] & S[i - 1][k]) && !(S[i][j] & S[i - 2][l]) && !(S[i - 1][k] & S[i - 2][l]))
f[i][j][k] = max(f[i][j][k], f[i - 1][k][l] + cnt[i][j]);
if(n == 1)
for(i = 0; i < S[1].size(); i++) ans = max(ans, f[1][i][0]);
else
for(i = 0; i < S[n].size(); i++)
for(j = 0; j < S[n - 1].size(); j++)
ans = max(ans, f[n][i][j]);
printf("%d\n", ans);
return 0;
}
[luoguP2704] 炮兵阵地(状压DP)的更多相关文章
- TZOJ 4912 炮兵阵地(状压dp)
描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P" ...
- 洛谷P2704 [NOI2001]炮兵阵地 [状压DP]
题目传送门 炮兵阵地 题目描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图 ...
- POJ1185 炮兵阵地 —— 状压DP
题目链接:http://poj.org/problem?id=1185 炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions ...
- poj - 1185 炮兵阵地 状压DP 解题报告
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 21553 Accepted: 8363 Description ...
- luogu 2704 炮兵阵地 状压dp
状压的基础题吧 第一次看感觉难上天,后来嘛就.. 套路:先根据自身状态筛出可行状态,再根据地图等其他限制条件筛选适合的状态加入答案 f i,j,k 分别代表 行数,本行状态,上行状态,再累加答案即可 ...
- POJ 1185 炮兵阵地 状压dp
题目链接: http://poj.org/problem?id=1185 炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K 问题描述 司令部的将军们打算在N*M ...
- [NOI2001]炮兵阵地 状压DP
题面: 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图.在每一格平原地形上最多 ...
- [POJ1185][NOI2001]炮兵阵地 状压DP
题目链接:http://poj.org/problem?id=1185 很裸的状压,考虑对于一行用二进制储存每一种的状态,但是状态太多了做不了. 观察到有很多状态都是不合法的,于是我们预处理出合法的状 ...
- 炮兵阵地 /// 状压DP oj26314
题目大意: 炮兵阵地 设置炮兵的位置 其上两位 下两位 左两位 右两位 不能同时设置炮兵 这题是 corn fields玉米地 的升级版 可以先看下这题的注释 更详细些 第一种方法是网上大多数题解的解 ...
- P2704 [NOI2001]炮兵阵地 (状压DP)
题目: P2704 [NOI2001]炮兵阵地 解析: 和互不侵犯一样 就是多了一格 用\(f[i][j][k]\)表示第i行,上一行状态为\(j\),上上行状态为\(k\)的最多的可以放的炮兵 发现 ...
随机推荐
- CentOS 安装图形化界面方法
登录系统,使用yum 安装 #yum groupinstall 'X Window System' -y 安装GNOME桌面环境 #yum groupinstall 'GNOME Desktop ...
- UVALive - 6428(扩展欧几里德)
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=48388 前段时间偶然碰到的一道题,今天突然想到没把它记录下来. 比较不错的扩 ...
- PHP连接数据操作步骤
数据库的操作步骤: 端口号:0到65535 3306:mysql数据库的默认端口号(可修改) mysql_connect(“本机地址”,“用户名”,“密码”,); new_link:如果用同样的参数第 ...
- Ionic之ui-sref引入图片,图片部分挡住解决方案
ionic图片设置大小跟图片像素相同,但是使用ui-sref="parkInfo"上半部分图片会挡住,增加height的高度,就可以显示原本图片 页面: <ion-conte ...
- 【学习笔记】深入理解js原型和闭包(3)——prototype原型
既typeof之后的另一位老朋友! prototype也是我们的老朋友,即使不了解的人,也应该都听过它的大名.如果它还是您的新朋友,我估计您也是javascript的新朋友. 在咱们的第一节(深入理解 ...
- CSData
NSString 转换成NSData 对象 NSData* xmlData = [@"testdata" dataUsingEncoding:NSUTF8StringEncodin ...
- Linux 从源码编译安装 Nginx
Nginx 是一个高性能的 HTTP 和 反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器.Nginx 编译安装比较简单,难点在于配置.下面是 Nignx 0.8.54 编译安装和简 ...
- MFC技术积累——基于MFC对话框类的那些事儿4
3.3.4 借助兼容DC加载DIB位图 创建一个与设备环境相兼容的DC,通过将位图暂时导入至兼容DC,然后利用CDC::BitBlt 或者CDC::StretchBlt函数将位图绘制到设备环境中. 示 ...
- mybaits2-Dao开发
项目结构: 1.创建project,导入相关依赖(前提).配置db.properties与mybaits-config #mysql驱动 db.driver=com.mysql.jdbc.Driver ...
- Linux下使用vi命令后退出方式
退出Vi 当编辑完文件,准备退出Vi返回到shell时,可以使用以下几种方法之一. 在命令模式中,连按两次大写字母Z,若当前编辑的文件曾被修改过,则Vi保存该文件后退出 ...