poj 1185 炮兵阵地 状态压缩dp
思路:定义一个三维数组dp[x][i][j]其中x为now和pre两种状态,now表示当前两行最优解,pre表示出了本行外,前两行的最优解。那么状态转移方程为
dp[now][j][k]=max(dp[now][j][k],dp[pre][k][r]+num[i][j][1])。num[i][j][1]表示第i行的第j个状态的1的个数。转移条件是!(num[i][j][0]&num[i-1][k][0])&&!(num[i][j][0]&num[i-2][r][0])&&!(num[i-1][k][0]&num[i-2][r][0])为真。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#define Maxn 1010
using namespace std;
int dp[][Maxn][Maxn],now,pre,num[][Maxn][],cnt1,cnt2,cnt3,graphic[][],n,m;
void dfs(int u,int j,int f)
{
int i;
if(j==m)
{
int sum,cc;
sum=cc=;
for(i=m;i>=;i--)
{
sum+=graphic[u][i]*(<<(m-i));
if(graphic[u][i])
cc++;
}
if(f<=)
{
if(graphic[u][j])
{
if(sum!=)
{
num[u][++cnt1][]=sum-;
num[u][cnt1][]=cc-;
}
}
else
{
num[u][++cnt1][]=sum;
num[u][cnt1][]=cc;
}
}
else
{
if(graphic[u][j])
{
if(sum!=)
{
num[u][++cnt1][]=sum-;
num[u][cnt1][]=cc-;
}
num[u][++cnt1][]=sum;
num[u][cnt1][]=cc;
}
else
{
num[u][++cnt1][]=sum;
num[u][cnt1][]=cc;
}
}
return ;
}
if(f<=)
{
if(graphic[u][j]==)
{
graphic[u][j]=;
dfs(u,j+,f+);
graphic[u][j]=;
}
else
dfs(u,j+,f+);
}
else
{
if(graphic[u][j])
{
dfs(u,j+,);
graphic[u][j]=;
dfs(u,j+,f+);
graphic[u][j]=;
}
else
dfs(u,j+,f+);
}
}
void out(int x)
{
if(x==||x==)
{
printf("%d",x);
return ;
}
int temp=x%;
out(x/);
printf("%d",temp);
}
int main()
{
int i,j,k,r;
char str[];
memset(graphic,,sizeof(graphic));
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(dp,,sizeof(dp));
memset(num,,sizeof(num));
memset(graphic,,sizeof(graphic));
for(i=;i<=n;i++)
{
scanf("%s",&str);
for(j=;j<m;j++)
{
if(str[j]=='P')
graphic[i][j+]=;
else
graphic[i][j+]=;
}
}
dfs(,,);
cnt2=cnt1;
cnt1=;
dfs(,,);
now=,pre=;
for(i=;i<=cnt2;i++)
for(j=;j<=cnt1;j++)
{
if(!(num[][i][]&num[][j][]))
dp[now][j][i]=num[][i][]+num[][j][];
}
for(i=;i<=n;i++)
{
cnt3=cnt2,cnt2=cnt1,cnt1=;
dfs(i,,);
now=!now,pre=!pre;
for(j=;j<=cnt1;j++)
for(k=;k<=cnt2;k++)
for(r=;r<=cnt3;r++)
{
if(!(num[i][j][]&num[i-][k][])&&!(num[i][j][]&num[i-][r][])&&!(num[i-][k][]&num[i-][r][]))
dp[now][j][k]=max(dp[now][j][k],dp[pre][k][r]+num[i][j][]);
}
}
int ans=;
for(i=;i<=cnt1;i++)
for(j=;j<=cnt2;j++)
{
ans=max(ans,dp[now][i][j]);
}
printf("%d\n",ans);
}
return ;
}
poj 1185 炮兵阵地 状态压缩dp的更多相关文章
- POJ - 1185 炮兵阵地 (状态压缩)
题目大意:中文题目就不多说大意了 解题思路: 1.每行最多仅仅有十个位置,且不是山地就是平原,那么就能够用1表示山地,0表示平原,将每一行的状态进行压缩了 2.接着找出每行能放炮兵的状态.先不考虑其它 ...
- POJ 3254 炮兵阵地(状态压缩DP)
题意:由方格组成的矩阵,每个方格可以放大炮用P表示,不可以放大炮用H表示,求放最多的大炮,大炮与大炮间不会互相攻击.大炮的攻击范围为两个方格. 分析:这次当前行的状态不仅和上一行有关,还和上上行有关, ...
- POJ 1185 炮兵阵地 状压dp
题目链接: http://poj.org/problem?id=1185 炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K 问题描述 司令部的将军们打算在N*M ...
- POJ1185 - 炮兵阵地(状态压缩DP)
题目大意 中文的..直接搬过来... 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平 ...
- poj - 1185 炮兵阵地 状压DP 解题报告
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 21553 Accepted: 8363 Description ...
- POJ 1185炮兵阵地 (状压DP)
题目链接 POJ 1185 今天艾教留了一大堆线段树,表示做不动了,就补补前面的题.QAQ 这个题,我第一次写还是像前面HDU 2167那样写,发现这次影响第 i 行的还用i-2行那样,那以前的方法就 ...
- [poj 1185] 炮兵阵地 状压dp 位运算
Description 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用&quo ...
- luogu2704 炮兵阵地 状态压缩DP
题目大意:一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),在每一格平原地形上最多可以布置一支炮兵部队,能攻击到的区域:沿横向左右各两格,沿纵向上 ...
- POJ1185炮兵阵地(状态压缩 + dp)
题目链接 题意:给出一张n * m的地图,其中 有的地方能放大炮,有的地方不能,大炮与上下左右两个单位范围内会相互攻击,问最多能放几个大炮 能放大炮为1不能放大炮为0,把每一行看做一个状态,要除去同一 ...
随机推荐
- Gym 100507L Donald is a postman (水题)
Donald is a postman 题目链接: http://acm.hust.edu.cn/vjudge/contest/126546#problem/L Description Donald ...
- Spring EL hello world example
The Spring EL is similar with OGNL and JSF EL, and evaluated or executed during the bean creation ti ...
- delphi 窗口最大化后控件的大小变化怎么设置
设置按钮的Anchors属性.可以通过此属性设置其边界是否随父类一起变化.默认akleft+aktop即左边界和上边界随窗口变化,也就是说如果窗口位置移动了,按钮将保持其left和top边界与窗口的距 ...
- Win7关机出现关闭程序提示框
运行输入Gpedit.msc回车打开组策略,在左侧选计算机配置/管理模板/系统/关机选项,在右侧双击“关闭会阻止或取消关机的应用程序的自动终止功能”,在打开的提示框中选“已启用”,按确定即可.
- when not exists 用法
USE [ChangHong_612]GO/****** Object: StoredProcedure [dbo].[st_MES_UpdateInspectResult] Script Date: ...
- socket断开连接的四次握手及常见过程解析
TCP的协议文档对TCP的一些规定:文档名称-RFC793 TCP消息头的控制位 URG:紧急指针字段有效 ACK:确认头部字段有效 PSH:强制函数 RST:重置链接 SYN:同步系列号码 FIN ...
- MEF 编程指南(七):使用目录
目录(Catalogs) MEF 特性编程模型的核心价值,拥有通过目录动态地发现部件的能力.目录允许应用程序轻松地使用那些通过 Export Attribute 注册自身的导出.下面列出 MEF ...
- Java中throws和throw的区别讲解
当然,你需要明白异常在Java中式以一个对象来看待.并且所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,但是一般情况下Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示, ...
- centos6.4上安装phpmyfaq
phpmyfaq真是奇怪呀,官网上只能下载到当前的版本,无法下载以前的版本.官网为:http://www.phpmyfaq.de/ 官网上没有phpmyfaq的安装方法,我在网上找了下,这就个文章还比 ...
- Ectouch修改虚拟销售数量的方法
1.参考:http://zhidao.baidu.com/link?url=5OEkRlKqtRcmnO6iyW2pq-gw1aj-1S6QdImmBkQZHHt6tcvT50aIf_1nibP3T6 ...