最大K段和
题目大意
有一个长度为 \(N\) 的序列 \(A\) 。他希望从中选出不超过 \(K\) 个连续子段,满足它们两两不相交,求总和的最大值(可以一段也不选,答案为 \(0\))。
分析
很容易想到 \(O(n^2)\) 的 \(dp\)
设 \(f[i][j]\) 表示选到第 \(i\) 位,已选了 \(j\) 段时的最大答案
那么 \(f[i][j] = \max(f[i-1][j] , s[i] + \max_\limits{0<l<i}(f[l][j-1] - s[l]))\)
然后维护最大的 \(f[l][j-1]-s[l]\) ,\(O(1)\) 更新即可
然后我们可以想到 \(WQS\) 二分(虽然我想不到)
它大概就是解决:有 \(n\) 个带权物品,用满足一定限制的方法选 \(m\) 个,使得其权值和取最值,而且权值和的最值是关于 \(m\) 的凸函数
注意 \(x\) 是段数
用直线 \(y=kx + b\) 去切
因为我们要求最大值,所以要最大化 \(b\)
\(b=y-kx\)
那么我们就可以将原来的 \(dp\) 是改为
\(f[i]=\max(f[i-1] , s[i] - k + \max_\limits{0<l<i}(f[l]-s[l]))\)
总的来说,先二分 \(k\),然后判断就 \(dp\),并记录所分的段数
段数恰为 \(m\) 时就为答案
注意最后要以 \(k=ans\) 再 \(dp\) 一遍
\(Code\)
#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
typedef long long LL;
const int N = 1e5 + 5;
int n , k , a[N];
LL f[N] , g[N] , s[N] , l , r , mid , ans;
bool check()
{
int x = 0;
for(register int i = 1; i <= n; i++)
{
f[i] = f[i - 1] , g[i] = g[i - 1];
if (f[x] + s[i] - s[x] - mid > f[i])
f[i] = f[x] + s[i] - s[x] - mid , g[i] = g[x] + 1;
if (f[i] - s[i] > f[x] - s[x]) x = i;
}
return g[n] >= k;
}
int main()
{
freopen("maxksum.in" , "r" , stdin);
freopen("maxksum.out" , "w" , stdout);
scanf("%d%d" , &n , &k);
for(register int i = 1; i <= n; i++)
scanf("%d" , &a[i]) , s[i] = s[i - 1] + a[i];
r = 0x3f3f3f3f3f3f3f3f;
while (l <= r)
{
mid = (l + r) >> 1;
if (check()) ans = mid , l = mid + 1;
else r = mid - 1;
}
mid = ans , check();
printf("%lld" , f[n] + ans * k);
}
最大K段和的更多相关文章
- 求区间连续不超过K段的最大和--线段树+大量代码
题目描述: 这是一道数据结构题. 我们拥有一个长度为n的数组a[i]. 我们有m次操作.操作有两种类型: 0 i val:表示我们要把a[i]修改为val; 1 l r k:表示我们要求出区间[l,r ...
- eduCF#61 C. Painting the Fence /// DP 选取k段能覆盖的格数
题目大意: 给定n m 接下来给定m个在n范围内的段的左右端 l r 求选取m-2段 最多能覆盖多少格 #include <bits/stdc++.h> using namespace s ...
- 最大K段和题解
题目:XJOI335 传送门 [ >XJOI<] 重要提示:您的膜法等级必须达到3级6段才可使用本传送门,否则您会被小猫痛扁 因为博主太懒,不提供题面(QAQ)... 很容易想到使用DP, ...
- CodeForces 754D Fedor and coupons ——(k段线段最大交集)
还记得lyf说过k=2的方法,但是推广到k是其他的话有点麻烦.现在这里采取另外一种方法. 先将所有线段按照L进行排序,然后优先队列保存R的值,然后每次用最小的R值,和当前的L来维护答案即可.同时,如果 ...
- 第一章:1-11、在上题的分组交换网中,设报文长度和分组长度分别为x和(p+h)(bit),其中p为分组的数据部分的长度,而h为每个分组所带的控制信息固定长度,与p的大小无关。通信的两端共经过k段链路。链路的数据率为b(bit/s),但传播时延和结点的排队时间均可忽略不计。若打算使总的时延为最小,问分组的数据部分长度p应取为多大?
<计算机网络>谢希仁著第四版课后习题答案答: 分组个x/p, 传输的总比特数:(p+h)x/p 源发送时延:(p+h)x/pb 最后一个分组经过k-1个分组交换机的转发,中间发送时延:(k ...
- 第一章:1-10、试在下列条件下比较电路交换和分组交换。要传送的报文共x(bit),从源站到目的站共经过k段链路,每段链路的传播时延为d(s),数据率为C(bit/s)。在电路交换时电路的建立时间为s(s)。在分组交换时分组长度为p(bit),且各结点的排队等待时间可忽略不计。问在怎样的条件下,分组交换的时延比电路交换的要小?
<计算机网络>谢希仁著第四版课后习题答案答:对电路交换,当t=s时,链路建立: 当t=s+x/C,发送完最后一bit: 当t=s+x/C+kd,所有的信息到 ...
- 最大k乘积问题
68.最大k乘积问题 (15分)C时间限制:3000 毫秒 | C内存限制:3000 Kb题目内容:设I是一个n位十进制整数.如果将I划分为k段,则可得到k个整数.这k个整数的乘积称为I的一个k乘积. ...
- 一个自己研究出来的字符串匹配算法-k子串算法
前言 最近工作中需要写一个算法,而写完这个算法我却发现了一个很有意思的事情.需要的这个算法是这样的:对于A,B两个字符串,找出最多K个公共子串,使得这K个子串长度和最大.百度之没有这样的算法,然后就开 ...
- 20-最大k乘积问题
/* 最大k乘积问题 题目内容: 设I是一个n位十进制整数.如果将I划分为k段,则可得到k个整数. ...
- 2017-2018 ACM-ICPC, NEERC, Southern Subregional Contest A E F G H I K M
// 深夜补水题,清早(雾)写水文 A. Automatic Door 题意 \(n(n\leq 1e9)\)个\(employee\)和\(m(m\leq 1e5)\)个\(client\)要进门, ...
随机推荐
- 安装es可视化软件Kibana
一 Kibana介绍 Kibana 是一款开源的数据分析和可视化平台,它是 Elastic Stack 成员之一,设计用于和 Elasticsearch 协作. 您.可以使用 Kibana 对 Ela ...
- python基础之hashilb模块、logging模块
hashlib加密模块 1.何为加密 将文明数据处理成密文数据 让人无法看懂 2.为什么要加密 保证数据的安全,防止密码泄露 3.如何判断数据是否加密 密文数据的表现形式一般都是一串没有规则的字符串( ...
- apt install protobuf
protobuf介绍:https://www.cnblogs.com/niuben/p/14212711.html protobuf利用源码编译安装已经看到过很多方法,这里总结下用apt安装的方法. ...
- [编程基础] Python字符串替换笔记
Python字符串替换笔记 Python字符串替换笔记主要展示了如何在Python中替换字符串.Python中有以下几种替换字符串的方法,本文主要介绍前三种. replace方法(常用) transl ...
- [深度学习] tf.keras入门5-模型保存和载入
目录 设置 基于checkpoints的模型保存 通过ModelCheckpoint模块来自动保存数据 手动保存权重 整个模型保存 总体代码 模型可以在训练中或者训练完成后保存.具体文档参考:http ...
- Hadoop详解(04-1) - 基于hadoop3.1.3配置Windows10本地开发运行环境
Hadoop详解(04-1) - 基于hadoop3.1.3配置Windows10本地开发运行环境 环境准备 安装jdk环境 安装idea 配置maven 搭建好的hadoop集群 配置hadoop ...
- python进阶之路2——解释器软件安装
内容概要 计算机五大组成部分 计算机三大核心硬件 操作系统 编程与编程语言 编程语言发展史 编程语言的分类 python解释器下载与安装 python解释器多版本共存 pycharm安装 计算机五大组 ...
- 万字干货! 使用docker部署jenkins和gitlab
阅读本文, 需要有基础的Git, Linux, Docker, Java, Maven, shell知识, 并最少有一台内存16G以上并已经安装好了Docker的机器. 1. 概述 2. 容器互联 3 ...
- 根号分治简单笔记 | P3396 哈希冲突
简要题意 你需要维护一个长度为 \(n\) 的序列 \(v\),支持: A x y 求整个序列中,所有模 \(x\) 为 \(y\) 的下标的元素的值,即: \[\sum_{i=0}^{\lfloor ...
- 【学习笔记】Splay
\(\texttt{0x01}\) 前言 Splay 树(伸展树)是一棵二叉搜索树,由 Daniel Sleator 和 Robert Tarjan 于 1985 年发明.它凭借旋转可以有 $O(\l ...