P2034 选择数字——线性dp(单调队列优化)
选择数字
题目描述
给定一行 \(n\) 个非负整数 \(a[1]...a[n]\) 。现在你可以选择其中若干个数,但不能有超过 \(k\) 个连续的数字被选择。你的任务是使得选出的数字的和最大。
输入格式
第一行两个整数 \(n\),\(k\) 。
以下 \(n\) 行,每行一个整数表示 \(a[i]\) 。
输出格式
输出一个值表示答案。
输入输出样例
输入
5 2
1
2
3
4
5
输出
12
说明/提示
对于 \(20\%\) 的数据,\(n\leq 10\) 。
对于另外 \(20\%\) 的数据,\(k=1\) 。
对于 \(60\%\) 的数据,\(n\leq 1000\) 。
对于 \(100\%\) 的数据,\(1\leq n\leq 100000\),\(1\leq k\leq n\),\(0\leq 数字大小\leq 1,000,000,000\) 。
时间限制 \(500ms\) 。
数组含义
\(a[i]\): 原数组。
\(sum[i]\): 前缀和,便于计算。
\(dp[i][1/0]\): 前 \(i\) 个数字的状态下,第 \(i\) 个数字选/不选的和的最大值。
\(q[i]\): 在单调数列中第 \(i\) 个数字,在原数组的下标。
基本思路
当第 \(i\) 个数字不选的时候,比较简单,取前 \(i-1\) 的状态选或不选的最大值即可。
\(dp[i][0]=max(dp[i-1][0],dp[i-1][1])\)
当第 \(i\) 个数字选的时候,可以枚举前 \(j\) 个数字的状态,依次取最大值即可。
\(dp[i][1]=max(dp[j][0])-sum[j]+sum[i]\)(伪代码,误抄)
但是本题数据很大,暴力枚举 \(j\) ,效率堪忧。
因为题中可以对 \(a[i]\) 选或不选,在有限制的条件下,\(a[i]\) 肯定越大越好,所以可以用到单调队列进行优化。
(在此提一句,刚开始我想到用贪心,从头枚举,每个区间都正好卡 \(k\) 的长度,但是很明显可以举出反例)
7 3
1 4 1 10000 1 4 1
用到单调队列,就可以把式子改了。
\(dp[i][1]=dp[q[head]][0]-sum[q[head]]+sum[i]\)
最后记得开 \(long long\) 哟。
代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e6+50;
int n,k;
ll a[maxn];
ll sum[maxn];
ll dp[maxn][2];
ll q[maxn];
int main(){
    int head=1;
    int tail=1;//这个我测试了一下,必须是1,若为0,则需要进行初始化
    cin>>n>>k;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        sum[i]=sum[i-1]+a[i];
    }
    dp[1][1]=a[1];//tail=0时必加的初始化
    for(int i=1;i<=n;i++){
        dp[i][0]=max(dp[i-1][0],dp[i-1][1]);
        while(q[head]<i-k&&head<=tail){//去掉最先走出队列,而且值也不大的数字
            head++;
        }
        dp[i][1]=dp[q[head]][0]-sum[q[head]]+sum[i];
        while(sum[i]-dp[i][0]<sum[q[tail]]-dp[q[tail]][0]&&head<=tail){//若尾端加入的数字,去掉的数字总值比i时还大,则直接去掉
            tail--;
        }
        q[++tail]=i;
    }
    printf("%lld\n",max(dp[n][1],dp[n][0]));
    return 0;
}
P2034 选择数字——线性dp(单调队列优化)的更多相关文章
- Mowing the Lawn【线性dp + 单调队列优化】
		题目链接:https://ac.nowcoder.com/acm/contest/2652/G 题目大意:与上一篇博客 烽火传递 差不多. 1.一共n头羊,若超过m头连续的羊在一起,就会集体罢工,每头 ... 
- [poj3017] Cut the Sequence (DP + 单调队列优化 + 平衡树优化)
		DP + 单调队列优化 + 平衡树 好题 Description Given an integer sequence { an } of length N, you are to cut the se ... 
- Codeforces 1077F2 Pictures with Kittens (hard version)(DP+单调队列优化)
		题目链接:Pictures with Kittens (hard version) 题意:给定n长度的数字序列ai,求从中选出x个满足任意k长度区间都至少有一个被选到的最大和. 题解:数据量5000, ... 
- Luogu 2627 修建草坪 (动态规划Dp + 单调队列优化)
		题意: 已知一个序列 { a [ i ] } ,求取出从中若干不大于 KK 的区间,求这些区间和的最大值. 细节: 没有细节???感觉没有??? 分析: 听说有两种方法!!! 好吧实际上是等价的只是看 ... 
- Codeforces 445A Boredom(DP+单调队列优化)
		题目链接:http://codeforces.com/problemset/problem/455/A 题目大意:有n个数,每次可以选择删除一个值为x的数,然后值为x-1,x+1的数也都会被删除,你可 ... 
- 股票交易(DP+单调队列优化)
		题目描述 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预测到了未来T天内某只股票的走势,第i天的股票买入价为每股APi, ... 
- 3622 假期(DP+单调队列优化)
		3622 假期 时间限制: 1 s 空间限制: 64000 KB 题目等级 : 黄金 Gold 题目描述 Description 经过几个月辛勤的工作,FJ决定让奶牛放假.假期可以在1-N天内任意选择 ... 
- Codeforces 940  区间DP单调队列优化
		A #include <bits/stdc++.h> #define PI acos(-1.0) #define mem(a,b) memset((a),b,sizeof(a)) #def ... 
- poj1821 Fence(dp,单调队列优化)
		题意: 由k(1 <= K <= 100)个工人组成的团队应油漆围墙,其中包含N(1 <= N <= 16 000)个从左到右从1到N编号的木板.每个工人i(1 <= i ... 
随机推荐
- 初学python笔记
			一.关于python ① 由荷兰人Guido van Rossum(龟叔)于1989年圣诞节为打发无聊时间所编写的编程语言. ② python的特点:优雅 明确 简单.代码量少,运行速度快. 缺点:运 ... 
- Oracle RMAN各类压缩算法对比测试
			1.背景概述 2.本次测试环境基本信息 3.测试步骤 3.1. 使用BCO进行压缩备份 3.2. 不使用压缩备份 3.3. 使用ACO中LOW级别进行压缩备份 3.4. 使用ACO中MEDIUM级别进 ... 
- 注解实现SpringCache自定义失效时间
			注解实现SpringCache自定义失效时间 SpringCache是一个很方便的缓存框架,但是官方提供的缓存的配置只有全局的缓存失效时间,没有针对某个命名空间做配置,因为工作上业务的关系需要针对某一 ... 
- CentOS7——配置阿里云镜像源
			CentOS7--配置阿里云镜像源 #下载CentOS 7的repo文件 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun ... 
- 用头发换JS的第一天
			因为平时也在上班,这些都是在地铁上抽空开始看的,总结来说还是有一些收获存在,每次看都能发现一些新东西,废话不多说,开撸! JavaScript是一种网页编程语言,可以对网页的行为进行编程,简单来说HT ... 
- PuTTY通过SSH连接上Ubuntu20.04
			在PuTTY中连接到Ubuntu20.04大致需要几个步骤(不一定对应文本中的序号):1) 安装opensh-server (Ubuntu安装好之后 ,一般openssh-client自动已经安装好) ... 
- 从零开始的Spring Boot(2、在Spring Boot中整合Servlet、Filter、Listener的方式)
			在Spring Boot中整合Servlet.Filter.Listener的方式 写在前面 从零开始的Spring Boot(1.搭建一个Spring Boot项目Hello World):http ... 
- 【环境安装】Docker安装
			[环境安装]Docker安装 CentoOS-7 安装步骤: 1.卸载已经安装的Docker sudo yum remove docker \ docker-client \ docker-clien ... 
- 004.OpenShift命令及故障排查
			一 CLI访问OpenShift资源 1.1 资源操作 OCP将OpenShift集群中的为由主节点管理的对象统称为资源,如:node.service.pod.project.deployment.u ... 
- mysql主从同步参数
			默认情况下,mysql的主从同步,会启用三个线程,两个IO线程和一个SQL线程.主从同步的主要文件就是binlog文件,从库从主库的binlog中读取数据,然后记录在从库自己的relaylog中,然后 ... 
