20190630模拟赛B(单调队列优化dp)
。dp无疑了其实。
在考场上,我写了一个错解,但是数据小都能过,只是会爆空间,考场上想着怎么用滚动数组优化来着。。。。把错解的方程列出来吧
for(int i=;i<=n;i++)
{
for(int j=;j<=k;j++)
{
if(j!=)
dp[i][j]=max(dp[i-][j],dp[i-][j-]+a[i]);//dp[i][j]表示前i个里,第j个选不选
else
dp[i][j]=ans;
ans=max(dp[i][j],ans);
}
}
很明显错的了。但是回家发现离正解也差得不远了。我一开始已经想到了前缀和,但是不知道哪里出了点问题。
总结错误原因:空间炸了。观察方程,其实除了的小问题在这里:我明明可以把一整段加起来,但是却用了单个的加,这就导致了时空的炸裂。
于是改造dp数组:还是前i个点,但是第二个改造为j为断点,所以dp表示前i个点在j断时的最大值,方程:
dp[i]=max(dp[i],dp[j-1]+a[j]+...+a[i]);
dp类似一个前缀和吧。可以把后面一大串的a[j]+...+a[i]用前缀和维护,就变成了
dp[i]=max(dp[i],dp[j-1]+sum[i]-sum[j]);
所以,dp里面的值只和一个变量有关,所以可以使用(我及其不熟练的)单调队列进行维护。
#include<bits/stdc++.h>
using namespace std;
const int maxn=;
int n,m;
int a[maxn];
int sum[maxn];
int dp[maxn];
int que[maxn];//数组模拟队列
int d[maxn];//值
int h=,t=; int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
sum[i]=sum[i-]+a[i];//前缀和
}
for(int i=;i<=n;i++)
{
d[i]=dp[i-]-sum[i];//首先,队尾是当前值
while(h<=t&&d[que[t]]<d[i])t--;//代入方程式,判断最优解,弹掉不合适的
que[++t]=i;//放入一个可能最优的值
while(h<=t&&que[h]<i-m)h++;//再更新
dp[i]=d[que[h]]+sum[i];//更新状态
}
printf("%d",dp[n]);
return ;
}
估计有很多讲的不好不对,我自己都还有点懵呢,希望大佬指正。
(我恨dp)
20190630模拟赛B(单调队列优化dp)的更多相关文章
- 2018.07.10NOIP模拟 Knapsack(单调队列优化dp)
Knapsack 题目背景 SOURCE:NOIP2016-RZZ-4 T2 题目描述 有 n 个物品,第 i 个物品的重量为 ai . 设 f(i,j,k,l,m) 为满足以下约束的物品集合数量: ...
- 单调队列以及单调队列优化DP
单调队列定义: 其实单调队列就是一种队列内的元素有单调性的队列,因为其单调性所以经常会被用来维护区间最值或者降低DP的维数已达到降维来减少空间及时间的目的. 单调队列的一般应用: 1.维护区间最值 2 ...
- 单调队列优化DP,多重背包
单调队列优化DP:http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html 单调队列优化多重背包:http://blog.csdn ...
- bzoj1855: [Scoi2010]股票交易--单调队列优化DP
单调队列优化DP的模板题 不难列出DP方程: 对于买入的情况 由于dp[i][j]=max{dp[i-w-1][k]+k*Ap[i]-j*Ap[i]} AP[i]*j是固定的,在队列中维护dp[i-w ...
- hdu3401:单调队列优化dp
第一个单调队列优化dp 写了半天,最后初始化搞错了还一直wa.. 题目大意: 炒股,总共 t 天,每天可以买入na[i]股,卖出nb[i]股,价钱分别为pa[i]和pb[i],最大同时拥有p股 且一次 ...
- Parade(单调队列优化dp)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2490 Parade Time Limit: 4000/2000 MS (Java/Others) ...
- BZOJ_3831_[Poi2014]Little Bird_单调队列优化DP
BZOJ_3831_[Poi2014]Little Bird_单调队列优化DP Description 有一排n棵树,第i棵树的高度是Di. MHY要从第一棵树到第n棵树去找他的妹子玩. 如果MHY在 ...
- 【单调队列优化dp】 分组
[单调队列优化dp] 分组 >>>>题目 [题目] 给定一行n个非负整数,现在你可以选择其中若干个数,但不能有连续k个数被选择.你的任务是使得选出的数字的和最大 [输入格式] ...
- [小明打联盟][斜率/单调队列 优化dp][背包]
链接:https://ac.nowcoder.com/acm/problem/14553来源:牛客网 题目描述 小明很喜欢打游戏,现在已知一个新英雄即将推出,他同样拥有四个技能,其中三个小技能的释放时 ...
- BZOJ1791[Ioi2008]Island 岛屿 ——基环森林直径和+单调队列优化DP+树形DP
题目描述 你将要游览一个有N个岛屿的公园.从每一个岛i出发,只建造一座桥.桥的长度以Li表示.公园内总共有N座桥.尽管每座桥由一个岛连到另一个岛,但每座桥均可以双向行走.同时,每一对这样的岛屿,都有一 ...
随机推荐
- Embarrassment
I don't know what I did wrong, why do I take care of me? I did something wrong before, your parents ...
- Java Intellij 第一个HelloWord
前言 最近重心点都在Java, 鉴于避免一些跟我一样学习Java开始啥都不懂,不知如何下手,方便小白快速入门.故写下此文,鉴于分享. (前提是安装jdk, 建议使用版本是1.8) JDK 安装地址:h ...
- requests模块(代理)篇
- 用户验证 - 代理验证 #可能需要使用HTTP basic Auth, 可以这样 # 格式为 用户名:密码@代理地址:端口地址 proxy = { "http": " ...
- CentOS 7 环境下修改主机名
本篇文章简单介绍在CentOS 7的环境下更改主机名的方法步骤. 首先我们开启虚拟机,用root账户进行登陆,并且打开终端.我们看到默认的主机名是我们新建虚拟机时自定义的名称. 接下来我们用命令更改主 ...
- AWVS安全渗透扫描
1.打开软件,点击New Scan 2.在website url中输入被扫描的网址,点击next 3.在scanning profile中选择测试的漏洞类型,默认选择default(默认) 在scan ...
- CTF-SMB渗透
环境 Kali ip 192.168.56.102 Smb 靶机ip 192.168.56.103 靶场下载: 链接:https://pan.baidu.com/s/1OwNjBf7ZEGmFlRq ...
- 利用Veeam保护SAP HANA数据库
利用Veeam保护SAP HANA数据库 前言 针对越来越多的SAP HANA备份需求,我们Team翻译.整理.借鉴了Veeam 的SAP HANA 大神 Clemens Zerbe 和 Ali Sa ...
- 阿里云 centos7.X mysql数据库安装、配置
前言 1024阿里云搞活动,ecs云服务新用户促销活动,活动连接就不贴了,买了之后暂时不知道要做啥,想着先安装mysql数据库. 步骤 root用户登录进来 1.配置mysql的yum源,yum lo ...
- 重装系统快速恢复使用习惯(各种图标摆放位置、环境变量、C盘可能存放的文件备份、编辑器配置、语言环境导出)
目录 电脑重装系统注意点 - 尽可能快速恢复你熟悉的 windows 基本使用场景 最好截图的点 常见文件拷贝 入口 查看桌面图标.快捷方式有哪些 程序员大合集 环境变量相关 pycharm 快捷键等 ...
- IntelliJ IDEA 2019.2最新版本免费激活码
IntelliJ IDEA 2019.2最新版本免费激活码 支持IDEA所有版本 正版授权激活码 今天更新了一下,支持java13等新功能.下面是激活码 812LFWMRSH-eyJsaWNlbnNl ...