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. 网络编程Socket它TCP它TIME_WAIT国家具体解释

    下面我们用最简单的一对一的客户server编程模型重现遇到的一些问题: 初学者socket当写作socket名其妙的问题.比方说bind函数返回的常见错误是EADDRINUSE 使用以下的程序重现这个 ...

  2. Matlab随笔之分段线性函数化为线性规划

    原文:Matlab随笔之分段线性函数化为线性规划 eg: 10x,            0<=x<=500 c(x)=1000+8x,    500<=x<=1000 300 ...

  3. Mac安装jupyter(原ipython)方法

    用了Mac之后非常不习惯,很多东西都要查才能完成=-=之前Python用的sublime和ide,今天看教程安利了一个jupyter 记录下用Mac安装jupyter的过程: 1.像其他安装Mac自带 ...

  4. WPF编游戏系列 之六 动画效果(1)

    原文:WPF编游戏系列 之六 动画效果(1)        本篇主要针对界面进行动画效果处理.首先在打开或关闭界面时,使其产生动态效果而不是生硬的显示或消失(如下图).其次在鼠标放到关闭窗口图标上时, ...

  5. wpf 快速建立可以拖动对象

    1.引用两个.net 程序集 2.xaml name space导入 xmlns:i ="http://schemas.microsoft.com/expression/2010/inter ...

  6. Android SharedPreferences中apply和commit的效率差距

    Android SharedPreferences中apply和commit的效率差距 经常看到它俩的速度有差别,apply和commit.到底差距多少,下面做一个统计.   apply commit ...

  7. 喜迎Win10周年版,芒果TV UWP完善手机视频离线下载

    喜迎Win10周年版更新,湖南卫视旗下唯一官方视频平台<芒果TV>近日向Win10商店提交了芒果TV UWP V3.1.0版,这次不仅在上一版(V3.0.0)的基础上完善了用户呼声最高的手 ...

  8. Android零基础入门第34节:Android中基于监听的事件处理

    原文:Android零基础入门第34节:Android中基于监听的事件处理 上一期我们学习了Android中的事件处理,也详细学习了Android中基于监听的事件处理,同时学会了匿名内部类形式,那么本 ...

  9. Linux下的wfopen(手工打造)

    Of Linux on wfopen (open wide-character version of the file name and mode) to achieve Not directly a ...

  10. Delphi Berlin 10.1.2 FMX用TMessageManager处理自定义消息

    看FMX代码,发现有两种消息处理的实现方式,一种是用TMessageManager来实现自定义的消息,另外一种象TEdit中的实现,直接声明消息方法.   早前,看过文章说TMessageManage ...