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表示贫瘠,把牛放在肥沃处,要求所有牛不能相 ...
随机推荐
- 【题解】CF611H New Year and Forgotten Tree
[题解]CF611H New Year and Forgotten Tree 神题了... 题目描述 给定你一棵树,可是每个节点上的编号看不清了,只能辨别它的长度.现在用问号的个数代表每个节点编号那个 ...
- random生成六位随机数验证码
需求: 生成一个六位随机验证码 # 傻瓜式纯数字实现import randomran = random.randint(100000, 999999) # ran = random.randrange ...
- github的代码上传成功但是不显示绿格子(一直拖....心痛的教训.....)
损失了我特么的很多格子啊啊啊啊,必死强迫症啊!!!! 究其原因就是客户端绑定邮箱错误 本地 :git config user.email 显示邮箱是否和github中设定的一样? git config ...
- python的分布式爬虫框架
scrapy + celery: Scrapy原生不支持js渲染,需要单独下载[scrapy-splash](GitHub - scrapy-plugins/scrapy-splash: Scrapy ...
- 20170405-STO库存转储单
1.工厂间转储: (1)MB1B 移动类型 301 工厂到工厂(一步)转账,->简单明了一步转储过账后会产生 GR,MITA增加了,MIZH减少了,MB03, **会产生 GR,如果俩工厂 标准 ...
- 2015.7.16(小高开忍住没有减仓,大盘涨3.5%,百股涨停——买进中重、中航,指导WXL错误)
1.大智慧轻微高开,按照昨天总结的震荡行情指导操作(pic1) a.震荡行情,开盘5分钟的走势不能指导操作, b.操作一定要等到2峰2谷出现后再做!开盘价不能作为峰.谷! c.只有当通道出现2.0%以 ...
- PAT 天梯赛 L1-027. 出租 【模拟】
题目链接 https://www.patest.cn/contests/gplt/L1-027 题意 给出一串电话号码,找出其中不同数字的个数,并且按递减顺序排列,然后 有一个index 数组,指出每 ...
- Sourse Insight使用过程中的常使用功能简介
1.查找定义: 在编辑区内,选中任意一个变量.函数.宏等,点击右键->Jump Definition,或者直接Ctrl+左击 2.编辑区切换
- qt5.4.1的imx6编译
2.到https://download.qt.io/archive/qt/5.4/5.4.1/single/下载源码包qt-everywhere-opensource-src-5.4.1.tar.gz ...
- 通过代码或者配置文件 对log4net进行配置
1.通过代码进行配置 1.1代码 http://stackoverflow.com/questions/16336917/can-you-configure-log4net-in-code-inste ...