P2704 [NOI2001]炮兵阵地

没学状压DP的看一下

此题意思很简单,如下图,就是十字架上的不能有两个点放炮兵。

在做此题前,先做一下玉米田

玉米田题解

分析:

而m即一行的个数小于等于10,每个格子上只有防或不放两种情况

很自然就会想到状压DP

还有一点很重要:

要符合题目条件的 只有平原可以放炮兵。

所以还要匹配 炮兵放法与平原 的关系(一共要判断3种,PH,列列列,横横横)。

如下是DP思考过程:(和玉米田差不多)

我们需要考虑定义,我们可以定义dp[i][j][k]表示到第i行状态为j,且上一行状态为k时的最大方案数

然后我们要来考虑初始化,因为状态肯定由前两行推过来,所以我们需要单独处理第一二行的方案数

取最大的话就一定要和 原来的自己、前一个状态+增长 比较,取较大的那个

最后还有一个问题,数组dp[105][1024][1024]!!!!这空间超400MB啊!

所以还得优化空间。

滚动数组:因为当前状态只与前两行有关,所以只需保留有用的三行

dp[105][1024][1024] --> dp[3][1024][1024] 好很多了(已经不爆了,但我们要做到最优,这是OIer的信念)

预处理:实际上没有几种情况是可以满足横排的(m = 10时,70个不到),于是我们就可以把这些满足条件的保存下来。~~~

dp[3][1024][1024] --> dp[3][70][70]

代码:

#include<cstdio>
#include<iostream>
using namespace std;
const int maxn=;
int n,m;
int st[],sum[];
int cnt;
int dp[][][];
int map[maxn];
int ans=;
void init(int s,int tot,int i)
{
if(i>=m)
{
st[++cnt]=s;
sum[cnt]=tot;
//printf("st=%d sum=%d\n",st[cnt],sum[cnt]);
return;
}
init(s,tot,i+);
init(s+(<<i),tot+,i+);
}
void add()
{
for(int i=;i<=cnt;i++)
{
//printf("st=%d map=%d ",st[i],map[0]);
if(!(map[]&st[i]))
{
dp[][i][]=sum[i];
//printf("%d\n",dp[1][i][0]);
}
//printf("sum=%d %d\n",sum[i],dp[0][i][0]);
}
for (int i=;i<=cnt;i++)
{
if(!(st[i]&map[]))
for (int j=;j<=cnt;j++)
if((!(st[j]&map[]))&&(!(st[i]&st[j])))
{
dp[][i][j]=sum[i]+sum[j];
//printf("i=%d j=%d %d\n",st[i],st[j],dp[2][i][j]);
}
}
}
void come_dp()
{
for (int i=;i<=n;i++)
{
for (int j=;j<=cnt;j++)
{
if(!(st[j]&map[i]))
for (int k=;k<=cnt;k++)
if((!(st[k]&map[i-]))&&(!(st[k]&st[j])))
{
for (int u=;u<=cnt;u++)
if((!(st[u]&map[i-]))&&(!(st[u]&st[j]))&&(!(st[u]&st[k])))
dp[i%][j][k]=max(dp[i%][j][k],dp[(i-)%][k][u]+sum[j]);
}
}
}
}
void work()
{
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++)
{
for (int j=;j<=m;j++)
{
char x;
cin>>x;
map[i]<<=;
if(x=='H') map[i]+=;
}
}
//printf("%d\n",map[1]);
init(,,);
add();
come_dp();
for (int i=;i<=cnt;i++)
for (int j=;j<=cnt;j++)
ans=max(ans,dp[n%][i][j]);
printf("%d",ans);
}
int main()
{
work();
return ;
}

逃qaq

C++ 洛谷 P2704 [NOI2001]炮兵阵地的更多相关文章

  1. [洛谷P2704] [NOI2001]炮兵阵地

    洛谷题目链接:[NOI2001]炮兵阵地 题目描述 司令部的将军们打算在NM的网格地图上部署他们的炮兵部队.一个NM的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示), ...

  2. 【题解】洛谷P2704 [NOI2001] 炮兵阵地(状压DP)

    洛谷P2704:https://www.luogu.org/problemnew/show/P2704 思路 这道题一开始以为是什么基于状压的高端算法 没想到只是一道加了一行状态判断的状压DP而已 与 ...

  3. 洛谷P2704 [NOI2001]炮兵阵地 [状压DP]

    题目传送门 炮兵阵地 题目描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图 ...

  4. 洛谷 P2704 [NOI2001]炮兵阵地

    题意简述 给定一张地图,有山地H,平原P,平原可放置炮兵, 炮兵可以攻击沿横向左右各两格,沿纵向上下各两格的区域 求最多放几个炮兵,使他们两两攻击不到 题解思路 枚举第i层,第i - 1层,第i - ...

  5. 洛谷P2704 [NOI2001]炮兵阵地题解

    题目描述 司令部的将军们打算在\(N * M\)的网格地图上部署他们的炮兵部队.一个\(N * M\)的地图由N行M列组成,地图的每一格可能是山地(用\("H"\) 表示),也可能 ...

  6. 洛谷 P2704 [NOI2001]炮兵阵地 (状态压缩DP+优化)

    题目描述 司令部的将军们打算在NM的网格地图上部署他们的炮兵部队.一个NM的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P" ...

  7. 【洛谷P2704】炮兵阵地

    题目大意:定义一个炮兵会影响该点所在坐标上下左右两个格子的范围,求一个 N*M 的网格里最多可以放多少个炮兵. 题解:发现这个问题有需要记录两个状态,即:上一层的状态和上两层的状态,若直接进行记录,空 ...

  8. 洛谷2704 [NOI2001]炮兵阵地

    题目戳这里 Solution 状压DP很好的入门题,用熟练位运算貌似也没那么难. 首先分析一下题目: 看见n=100,m=10,立马就想到了状压,看起来也像DP,所以我们还是采用行号为阶段的状压DP. ...

  9. P2704 [NOI2001]炮兵阵地 (状压DP)

    题目: P2704 [NOI2001]炮兵阵地 解析: 和互不侵犯一样 就是多了一格 用\(f[i][j][k]\)表示第i行,上一行状态为\(j\),上上行状态为\(k\)的最多的可以放的炮兵 发现 ...

随机推荐

  1. Windows系统时间(FILETIME和SYSTEMTIME)

    转载请标明出处,原文地址:http://blog.csdn.net/morewindows/article/details/8654298 欢迎关注微博:http://weibo.com/MoreWi ...

  2. Lync 2013和Exchange 2013集成

    定位到下面Powershell 文件夹: C:\Program Files\Microsoft\Exchange Server\V15\Scripts\,运行例如以下命令: .\Configure-E ...

  3. JDK源码阅读——Vector实现

    1 继承结构图 Vector同样继承自AbstractList,与ArrayList.LinedList一样,是List的一种实现 2 数据结构 // 与ArrayList一样,也是使用对象数组保存元 ...

  4. delphi自动调整combobox下拉列表宽度(PostMessage CB_SETDROPPEDWIDTH)

    在combobox所在的窗口的Formshow事件里调用即可 procedure SetComboBoxListWidth( AComboBox: TComboBox ); var i: Intege ...

  5. Rust这种新型的语言注定火不起来,功能太强大(特性太多),还不如用成熟稳定强大的C/C++,而且生态不行、所以恶性循环

    这种新型的语言注定火不起来,功能太强大(特性太多),还不如用成熟稳定强大的C/C++,,而Golang足够简单,入门快,编译快,性能也强悍,解决了服务端开发人员的痛点,,注定被大多数人接受... go ...

  6. Microsoft Enterprise Library 5.0 系列(四)

    企业库日志应用程序模块工作原理图: 从上图我们可以看清楚企业库日志应用程序模块的工作原理,其中LogFilter,Trace Source,Trace Listener,Log Formatter的信 ...

  7. Win8 Metro(C#)数字图像处理--2.51图像统计滤波算法

    原文:Win8 Metro(C#)数字图像处理--2.51图像统计滤波算法  [函数名称]   图像统计滤波   WriteableBitmap StatisticalFilter(Writeab ...

  8. iOS-HTTP浅析

    HTTP原理 什么是URL URL中常见的几种协议 什么是HTTP协议 HTTP是做什么的 为什么要使用HTTP协议 HTPP协议的通信过程介绍 HTTP请求 HTTP响应 HTTP请求的选择 两种发 ...

  9. 零元学Expression Blend 4 &ndash; Chapter 21 以实作案例学习MouseDragElementBehavior

    原文:零元学Expression Blend 4 – Chapter 21 以实作案例学习MouseDragElementBehavior 本章将教大家如何运用Blend 4内建的行为注入元件「Mou ...

  10. 设置代理调用WMTS服务

    一.数据准备 1.链接:http://pan.baidu.com/s/1sjzCytR 密码:uugc,下载DotNet版本 2. 发布切片服务,打开ogc服务可产看到相应的符合ogc标准的服务,如下 ...