题解 - 修剪草坪

题目(in 洛谷) 或 题目(in hszxoj)

题目大意

给定 \(n\) 个非负整数 \(a_1 \cdots a_n\)。现在你可以选择其中若干个数,但不能有超过 \(k\) 个连续的数字被选择。
求选出的数字的和最大。

思路简析

一个比较好的思路是反向思考:选择某些间隔小于等于 \(k\) (相邻间隔为 \(0\))的数字,求选择的数字的最小值。

但是我没看明白。

所以顺推并分讨:有两种情况:在前 \(i\) 个数中不选择/选择第 \(i\) 个数时的最大值,分别用 \(f_{i, 0}\)\(f_{i, 1}\) 表示。

\[f_{i, 0} = \max\{f_{i-1, 0}, f_{i-1, 1}\} \]

\[f_{i, 1} = \max_{j=i-k}^{i-1}\{f_{j, 0}+a_{j+1}+\cdots + a_i\} \]

考虑使用前缀和优化,则第二个式子可化简为:

\[\begin{split} f_{i, 1} &= \max_{j=i-k}^{i-1}\{f_{j, 0}+sum[i]-sum[j]\} \\&= \max_{j=i-k}^{i-1}\{f_{j, 0}-sum[j]\} +sum[i]\} \end{split} \]

这样就是要动态地维护一个区间内的最大值,因此使用单调队列。

每次的维护区间为 \(i-k \sim i-1\),并不包含 \(i\),所以应先弹出不合规的队首,然后更新 \(f_{i, 0}\)\(f_{i, 1}\),最后在保证单调性的同时将当前 \(i\) 加入队列。

CODE

Time complexity:\(\Omega(n)\)

#include <bits/stdc++.h>
namespace {
#define filein(x) freopen(x".in", "r", stdin)
#define fileout(x) freopen(x".out", "w", stdout)
#define files(x) filein(x), fileout(x)
using namespace std;
#define ll long long
#define db doubleconst int man = 1e5+10;
}int n, m;
ll sum[man], f[man][2];
int a[man];
deque <int> dq;
int main () {
#ifndef ONLINE_JUDGEfiles("test");
#endifscanf("%d%d", &n, &m);dq.push_back(0);for (int i = 1; i <= n; ++ i) {scanf("%d", a+i), sum[i] = sum[i-1]+a[i];while (dq.size() && i-dq.front()>m) dq.pop_front();f[i][0] = max(f[i-1][0], f[i-1][1]);if(!dq.empty()) f[i][1] = f[dq.front()][0]-sum[dq.front()]+sum[i];while (dq.size() && f[i][0]-sum[i]>f[dq.back()][0]-sum[dq.back()]) dq.pop_back();dq.push_back(i);} printf("%lld", max(f[n][0], f[n][1]));return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/741310.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

函数进阶应用2

进阶函数的具体应用场景查询并标记停产商品要求:停产商品标记为红颜色具体操作 选中B列——开始选项卡——条件规则——新建规则,选择“使用公式……格式的单元格”——在公式输入框中输入“=VLOOKUP(B2,选择区域,返回列,精确匹配)="停产”——格式,选填充色为红色—…

04 安装SSH

因为每一个老嵌入式都喜欢使用他的老windows进行开发,因此我决定使用SSH来开发rust,这样也不用在虚拟机里边再装一个vscode. 参考博客如何在windows下使用vscode连接linux虚拟机进行代码开发_windows vscode编辑linux文件-CSDN博客 Windows环境使用VSCode 调试Linux环境C/C++代…

Nuxt框架中内置组件详解及使用指南(四)

摘要:本文详细介绍了Nuxt 3框架中的两个内置组件:title: Nuxt框架中内置组件详解及使用指南(四) date: 2024/7/9 updated: 2024/7/9 author: cmdragon excerpt: 摘要:本文详细介绍了Nuxt 3框架中的两个内置组件:和的使用方法与示例。用于捕获并处理客户端错误,提供了错…

奇异值分解以及matlab实现

奇异值分解(Singular Value Decomposition)是线性代数中一种重要的矩阵分解,具有压缩矩阵信息的作用 目录一、奇异值分解的理论介绍1.奇异值分解的例子2.U的计算3.V的计算4.Σ的计算5.利用SVD对数据进行"降维"(1)对U与V进行分块,得到分块矩阵(2)去除奇异值后…

php:安装phpredisadmin

一,项目代码地址: https://github.com/erikdubbelboer/phpRedisAdmin 二,下载: 从命令行用wget下载 [root@blog phpredisadmin]# wget https://github.com/erikdubbelboer/phpRedisAdmin/archive/refs/tags/v1.20.0.tar.gz 下载完成后解压缩 [root@blog phpredisadmin]# tar …

数学推导

基本公式 (a+b)%mod=(a%mod+b%mod)%mod 设一个任意整数\(A=a*10^n+b*10^{n-1}+...+c\). 由此可以证明 \(A \quad mod \quad m=(((a \quad mod \quad m)*10+b \quad mod \quad m)*10...)+c) \quad mod \quad m\) 该证明可以应用在数位DP点击查看代码 #include<bits/stdc++.h…

OpenDevin 简介:一个有抱负的 AI 驱动的软件开发平台

来源链接:https://medium.com/ai-advances/introduction-to-opendevin-the-aspiring-ai-powered-software-development-platform-11ffc69e60cc 发布时间:2024-05-05T00:40:39.078ZOpenDevin 是一个创新的开源项目,旨在通过引入一个自主的 AI 软件工程师来彻底改变软件开发。…

PM2 ecosystem 服务器自动化部署

一:准备工作 1.1 :将项目上传至代码管理库(github,gitlab,bitbucket,等) 1.2 :Windows 和 服务器 都安装SSH,Git 工具。 二:开始 2.1 本地生成ssh key连接服务器//根据邮箱生成ssh key ssh-keygen -t rsa -C "..........@163.com"//仔细看注释 //1.如果生成过…

java推送打卡记录到企微,中文乱码

在开发机中,推送中文能正常显示,部署到windows服务器上,中文显示乱码 设置windows环境变量: JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8

Linux web服务

Web服务在Linux中存在许多可以提供web服务的软件,httpd、tomcat、nginx等Web通信的基本概念基于B/S架构的网页服务 HTTP HTML【1】、httpd软件 1、httpd软件安装httpd是软件基金会写出的 软件基金会(Apache)yum install -y httpdrpm -qa httpd httpd-2.4.37-62.module+el8.9…

jmeter分布式no-gui 测试报告

1、远程测试 https://jmeter.apache.org/usermanual/remote-test.html 2、 3、进行分布式压测是,服务器需要先启动jmeter-sever,启动jmeter-sever建议加上nobup,后开运行,停止服务时,先停master,在停slave,不然可能有问题。linux上具体的压测命令如下: 只有一台服务时…

vmware禁止虚拟主机开启后自动时间同步到宿主机

编辑虚拟机 VMX配置文件找到tools.syncTime = "FALSE"并在该行下添加如下七行,注意标点符号 time.synchronize.continue = "FALSE" time.synchronize.restore = "FALSE" time.synchronize.resume.disk = "FALSE" time.synchronize.sh…