poj 1185 状压dp+优化
http://poj.org/problem?id=1185
| Time Limit: 2000MS | Memory Limit: 65536K | |
| Total Submissions: 29176 | Accepted: 11303 |
Description

如果在地图中的灰色所标识的平原上部署一支炮兵部队,则图中的黑色的网格表示它能够攻击到的区域:沿横向左右各两格,沿纵向上下各两格。图上其它白色网格均攻击不到。从图上可见炮兵的攻击范围不受地形的影响。
现在,将军们规划如何部署炮兵部队,在防止误伤的前提下(保证任何两支炮兵部队之间不能互相攻击,即任何一支炮兵部队都不在其他支炮兵部队的攻击范围内),在整个地图区域内最多能够摆放多少我军的炮兵部队。
Input
接下来的N行,每一行含有连续的M个字符('P'或者'H'),中间没有空格。按顺序表示地图中每一行的数据。N <= 100;M <= 10。
Output
Sample Input
5 4
PHPP
PPHH
PPPP
PHPP
PHHP
Sample Output
6
Source
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define LL long long
int e[][];
int f[][][];
int N,M,tot,all;
int a[],t[];
int g[][];
int _g[][];
int sol(int x)
{
int r=;
for(int j=;j<M;++j)
{
if(x&(<<j)) {
r++;
for(int i=-;i<=;++i)
{
if(i==||j+i<||j+i>=M) continue;
if(x&(<<(j+i))) return -;
}
}
}
return r;
}
void init()
{
for(int i=;i<all;++i)
{
int x=sol(i);
if(x!=-){
a[tot]=i;
t[tot++]=x;
}
}
}
bool ok(int _a,int x)
{
int A=a[_a];
for(int i=;i<M;++i)
if((A&(<<i))&&e[x][M-i]) return ;
return ;
}
bool match(int _a,int _b)
{
int A=a[_a],B=a[_b];
for(int i=;i<M;++i)
if((A&(<<i))&&(B&(<<i))) return ;
return ;
}
int main()
{
int i,j,k=;
while(scanf("%d%d",&N,&M)==){tot=;
all=(<<M);memset(e,,sizeof(e));
memset(f,,sizeof(f));
memset(g,-,sizeof(g));
memset(_g,-,sizeof(_g));
for(i=;i<=N+;++i)
for(j=;j<=M;++j){
char c;
scanf(" %c",&c);
e[i][j]=c=='P'?:;
}
init();
for(i=;i<tot;++i)
for(j=;j<=N+;++j)
_g[i][j]=ok(i,j);
for(i=;i<tot;++i)
for(j=;j<tot;j++)
g[i][j]=match(i,j);
for(i=;i<=N+;++i)
{
for(int t1=;t1<tot;++t1)
{
if(!_g[t1][i-]) continue;
for(int t2=;t2<tot;++t2)
{
if(!_g[t2][i-]||!g[t1][t2]) continue;
for(int t3=;t3<tot;++t3)
{
if(!_g[t3][i]||!g[t2][t3]||!g[t1][t3]) continue;
if(f[i][t2][t3]<f[i-][t1][t2]+t[t3])f[i][t2][t3]=f[i-][t1][t2]+t[t3];
}
}
}
}
int ans=;
for(int t1=;t1<tot;++t1)
for(int t2=;t2<tot;++t2)
if(ans<f[N+][t1][t2])ans=f[N+][t1][t2];
printf("%d\n",ans);
}
return ;
}
poj 1185 状压dp+优化的更多相关文章
- poj 1185(状压dp)
题目链接:http://poj.org/problem?id=1185 思路:状态压缩经典题目,dp[i][j][k]表示第i行状态为j,(i-1)行状态为k时最多可以放置的士兵个数,于是我们可以得到 ...
- 炮兵阵地(POJ 1185状压dp)
题意:n*m地图'H'能放'p'不能放,布兵的方格上下左右不能布兵,给你地图求最大布兵数 分析:关系到前两行,所以dp[i][j][k]第i行状态为j,i-1行状态为k时的最大布兵数, 先求出所有可行 ...
- POJ1038 Bugs Integrated, Inc 状压DP+优化
(1) 最简单的4^10*N的枚举(理论上20%) (2) 优化优化200^3*N的枚举(理论上至少50%) (3) Dfs优化状压dp O(我不知道,反正过不了,需要再优化)(理论上80%) (4) ...
- POJ 3254 (状压DP) Corn Fields
基础的状压DP,因为是将状态压缩到一个整数中,所以会涉及到很多比较巧妙的位运算. 我们可以先把输入中每行的01压缩成一个整数. 判断一个状态是否有相邻1: 如果 x & (x << ...
- poj 1170状压dp
题目链接:https://vjudge.net/problem/POJ-1170 题意:输入n,表示有那种物品,接下来n行,每行a,b,c三个变量,a表示物品种类,b是物品数量,c代表物品的单价.接下 ...
- hdu 1185 状压dp 好题 (当前状态与上两行有关系)
/* 状压dp 刚开始&写成&&看了好长时间T0T. 状态转移方程 dp[i][k][j]=Max(dp[i][k][j],dp[i-1][l][k]+num[i][j]);( ...
- POJ 2411 状压DP经典
Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 16771 Accepted: 968 ...
- POJ 3254 状压DP
题目大意: 一个农民有一片n行m列 的农场 n和m 范围[1,12] 对于每一块土地 ,1代表可以种地,0代表不能种. 因为农夫要种草喂牛,牛吃草不能挨着,所以农夫种菜的每一块都不能有公共边. ...
- poj 3254 状压dp入门题
1.poj 3254 Corn Fields 状态压缩dp入门题 2.总结:二进制实在巧妙,以前从来没想过可以这样用. 题意:n行m列,1表示肥沃,0表示贫瘠,把牛放在肥沃处,要求所有牛不能相 ...
随机推荐
- ubuntu17.04 配置go环境变量
把官网下载好的tar解压后,go文件夹放到 /usr/local 目录下 在当前用户的 .bashrc 文件末尾添加 这句话 export PATH=$PATH:/usr/local/go/bin 执 ...
- Libsvm在matlab环境下使用指南
一.安装 http://www.csie.ntu.edu.tw/~cjlin/libsvm/matlab/.在这个地址上可以下的包含matlab接口的源程序.下载完后可以放到放到任意的盘上解压,最好建 ...
- 如何用云存储和CDN加速网站图片视频、阿里云OSS的使用(转)
总有人说阿里云主机带宽小,那只是因为你还停留在单机架构上. 阿里的架构设计,云主机主要用来跑程序的,附件的存储和访问主要靠OSS. 有人又会说了,OSS按存储费+流量双重计费伤不起,只是你不知道OSS ...
- 0607pm克隆&引用类&加载类&面向对象串讲&函数重载
克隆class Ren{ public $name; public $sex; function __construct($n,$s) { $this->name=$n; $this->s ...
- python3 multiprocessing 模块
多进程 Multiprocessing 模块 multiprocessing 模块官方说明文档 Process 类 Process 类用来描述一个进程对象.创建子进程的时候,只需要传入一个执行函数和函 ...
- iOS WKWebView OC 与 JS 交互学习
我写WKWebView 想让 服务端相应 一个 方法但是不响应,根据 UIWebView 用 JSContext就能拿到响应的处理经验是不是服务端 也需要 对 WKwebView有兼容的一个写法??? ...
- OpenGL帧缓存对象(FBO:Frame Buffer Object)
http://blog.csdn.net/dreamcs/article/details/7691690 转http://blog.csdn.net/xiajun07061225/article/de ...
- nodejs/REPL环境命令行操作命令
1,输入node 进入node[REPL]环境 2,按两次[ctrl+c]退出node[REPL]环境 3,上箭头会查找上次输入的命令 4,cls清屏 5,tab键会自动补全路径 6,REPL环境
- windows 服务安装报错
使用windows服务开发的定时任务,在win7上都运行良好,在windows server 2008上运行报错,报错信息如下 错误应用程序名称: GCWindowsService.exe,版本: 1 ...
- 【P2014】选课(树状DP)
蒟蒻的第二道树形DP,话说看了这个题的正常做法之后一脸蒙,森林转二叉树??什么诡异的操作,蒟蒻完全没明白那个原理是啥...可能是当初没好好学吧..不管了,索性直接DP. 不难看出,这个题的DP方程和刚 ...