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,把每一行看做一个状态,要除去同一 ...
随机推荐
- 如何在不装ORACLE的情况下使用PLSQL
原来我电脑装了oracle跟plsql,然后使用plsql的.后来因为某些原因,我重装了系统,把装的软件都格调了,需要重新装.当时在装plsql的时候我就想,我一直都是直接用plsql远程连接的服务器 ...
- STC89c52RC 的EEPROM和AVR的EEPROM
二者的EEPROM不是一回事,AVR片内的EEPROM是独立于程序存储器的数据存储器,本身不能存储程序并运行,但现代MCU很多支持IAP,利用IAP技术可在程序存储空间实现数据存储即替代EEPROM, ...
- thymeleaf中的内联[ [ ] ]
一.文本内联 [[…]]之间的表达式在Thymeleaf被认为是内联表达式,在其中您可以使用任何类型的表达式,也会有效th:text属性. <p>Hello, [[${session.us ...
- HTTP常见错误 400/401/403/404/500及更多
HTTP 错误 400 400 请求出错 由于语法格式有误,服务器无法理解此请求.不作修改,客户程序就无法重复此请求. HTTP 错误 401 401.1 未授权:登录失败 此错误表明传输给服务器的证 ...
- 代码静态分析工具——splint的学习与使用
引言 最近在项目中使用了静态程序分析工具PC-Lint,体会到它在项目实施中带给开发人员的方便.PC-Lint是一款针对C/C++语言.windows平台的静态分析工具,FlexeLint是针对其他平 ...
- git乱码问题
直接看连接吧. http://my.oschina.net/lujian863/blog/168837
- iOS开发-Core Location和Map Kit
一.Core Location确定物理位置 利用以下3种技术: 1.GPS(最精确的) 2.蜂窝基站ID定位(cell ID Location) 3.WPS(Wi-Fi Positioning Ser ...
- freeRadius 基础配置及测试
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html 内部邀请码:C8E245J (不写邀请码,没有现金送) 国 ...
- git使用具体介绍
1. Git概念 1.1. Git库中由三部分组成 Git 仓库就是那个.git 文件夹,当中存放的是我们所提交的文档索引内容,Git 可基于文档索引内容对其所管理的文档进行内容追踪 ...
- MyBatis之二:简单增删改查
这一篇在上一篇的基础上简单讲解如何进行增删改查操作. 一.在mybatis的配置文件conf.xml中注册xml与注解映射 <!-- 注册映射文件 --> <mappers> ...