[POJ 3017] 单调队列优化DP

POJ3017 Cut the Sequence(单调队列优化dp)好题!!必做!! Cut the Sequence POJ - 3017 Given an integer sequence { an } of length N, you are to cut the sequence into several parts every one of which is a consecutive subsequence of the original sequence. Every... 阅读详情

[POJ 3017]

Problem

  • 给定一个长度为N的序列A,要求把该序列分成若干段,在满足每段中所有数值和不超过M的前提下,让每段中所有数的最大值之和最小。
  • N<=10^5,M<=10^11,0<=Ai<=10^6

Solution

  • 很容易写出状态转移方程
  • F[i]=  min  { F[j] + max(Ak) }   (j+1<=k<=i)
  • 考虑什么状态能更新当前答案
  • 对于当前点i,它能到达的最左边的点是j,设X=max{ Aj ~ Ai }
  • F数组值单调递增
  • F[j-1]+X <= F[j]+X <= F[j+1]+X <= F[pos]+X
  • 单调队列维护即可

Code


#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define rep(i,a,b) for(ll i=(a);i<=(b);i++)
#define ll long long
using namespace std;
const ll N=2e6;
ll a[N],q[N],f[N],now=0,tail,head,l,r,n,m;
int main()
{
	//freopen("a.in","r",stdin);
	memset(f,0x3f,sizeof(f));f[0]=0;
	scanf("%lld%lld",&n,&m);
	tail=0,head=1,l=0;
	rep(i,1,n){
		scanf("%lld",&a[i]);
		if(a[i]>m){cout<<-1;return 0;}
		now+=a[i];
		while(now>m)now-=a[++l];
		while(head<=tail&&a[q[tail]]<=a[i])tail--;
		q[++tail]=i;
		while(head<=tail&&q[head]<l)head++;
		ll pos=l;//注意
		rep(j,head,tail){
			f[i]=min(f[i],f[pos]+a[q[j]]);
			pos=q[j];
		}
		
	}
	cout<<f[n];
	return 0;
}

 

Minimal m Sums 给定n 个整数组成的序列,现在要求将序列分割为m 段,每段子序列中的数在原序列中连续排列。如何分割才能使这m段子序列的和的最大值达到最小? Description 给定n 个整数组成的序列,现在要求将序列分割为m 段,每段子序列中的数在原序列中连续排列。如何分割才能使这m段子序列的和的最大值达到最小? 编程任务: 给定n 个整数组成的序列,编程计算该序列的最优m 段分割,使m 段子序列的和的最大值达到最小。 Input 输入由多组测试数据组成。 每组测试数据输入的第1行中有2个正整数n和m。正整数n是序列的长度;正整数m是分割的段数。接下来的一行中有n个整数。 Output 对应每组输入,输出的每行是计算出的m段子序列的和的最大值的最小值。 Sample Input 1 1 10 Sample Output 10 立即下载

相关推荐

Renesas:定时器输入捕获

一、PWM输入捕获 1、Smart Configurator配置 注意:在使用前,需要使能对应的定时器!否侧无法正常进行输入捕获! 2、脉冲宽度的获取 如何区分高低电平的脉冲宽度:最常用的方法就是在触发中断后,判断IO口的高低电平,来确认是上升沿触发的中断还是下降沿触发的中断。 若无法进入中断,可查看:Renesas:配置中断的常规流程 (1)中断方式(Smart Configurator生成的代码) #pragma interrupt r_Config_TAUB0_0_i...

不吃鱼的猫的博客 2479

$Poj3017\ Cut\ The\ Sequence$ 单调队列优化$DP$

Poj AcWing Description 给定一个长度为N的序列 A,要求把该序列分成若干段,在满足“每段中所有数的和”不超过M的前提下,让“每段中所有数的最大值”之和最小. N<=105,M<=1011,0<Ai<=106 Sol 一篇比较清楚的题解 $OvO$ $F[i]$表示把前$i$个数分成若干段,满足每段中所有数之...

weixin_30808253的博客 134

深入浅出:拆解RK3588 DVP摄像头驱动框架,从DTS配置到V4L2子系统

本文深入解析RK3588 DVP摄像头驱动框架,从DTS配置到V4L2子系统的完整实现。详细介绍了瑞芯微RK3588的多媒体子系统架构、设备树配置逻辑、rkcif驱动与V4L2框架的交互机制,以及用户空间调试与性能优化技巧,帮助开发者解决DVP摄像头驱动中的常见问题。

weixin_42525632的博客 265

A-序列划分-牛客竞赛

题目描述 给出一个长为 n 的序列 A1,A2,…,An 你需要将序列 A 划分成若干个连续段,一段的权值定义为这段内的所有数的按位或。 你需要恰当地选择划分方案,使得每段的权值之和最大。 求出每段的权值之和的最大值。 输入描述:第一行一个整数 n。接下来一行 n 个整数A1,A2,…,An 输出描述:一个整数,表示答案。 输入 3 9 6 16 输出 31 说明一种最优的方案是划分成 (9,6) (16)。 备注:1≤n≤10^5, 0≤An≤10^9 #include&..

qq_40728302的博客 1213

从AP到ADSP:高通8650 AudioReach中GSL-Passthru-GPR的数据通路剖析

本文深入剖析了高通骁龙8650平台AudioReach架构中,音频数据从应用处理器(AP)到音频数字信号处理器(ADSP)的完整传输路径。重点解析了GSL(Graph Service Layer)如何封装命令,并通过Passthru驱动与GPR(Generic Packet Router)协同工作,实现跨处理器的高效、异步数据交换,揭示了现代手机复杂音频系统背后的核心通信机制。

cherry的博客 536

【Linux 驱动开发】STM32MP1 LCD 显示系统完整实践指南

STM32MP1 LCD显示系统实践指南 本文全面介绍STM32MP1平台实现MIPI DSI LCD显示的完整流程,涵盖硬件连接、设备树配置、显示原理和驱动实现。主要内容包括: 硬件连接:详细说明MIPI DSI差分对、背光PWM、复位/供电管脚的连接方式 设备树配置: PWM背光控制节点设置 LTDC与DSI端口映射关系 Panel节点参数定义 显示基础:讲解LCD/OLED显示原理、常见接口类型(RGB/LVDS/MIPI/HDMI)及信号时序 驱动实现。

猫猫的小茶馆 493

BZOJ4245: [ONTAK2015]OR-XOR 解题报告

Description给定一个长度为n的序列a[1],a[2],…,a[n],请将它划分为m段连续的区间,设第i段的费用c[i]为该段内所有数字的异或和,则总费用为c[1] or c[2] or … or c[m]。请求出总费用的最小值。 Input第一行包含两个正整数n,m(1<=m<=n<=500000),分别表示序列的长度和需要划分的段数。 第一行包含n个整数,其中第i个数为ai。 Ou

L_0_Forever_LF的专栏 856

STM32 移植FreeModbus详细过程

modbus是一个非常好的串口协议(当然也能用在网口上),它简洁、规范、强大。可以满足大部分的工业、嵌入式需求。 这里详细说下如何将freemodbus移植到stm32平台。我之前下载的版本是1.6,我会在我的下载链接里面加上1.6的freemodbus压缩包以及我已经移植好的stm32 for freemodbus版本。我上传的移植好的绝对没问题,经过多个板子测试。这里编译器使用的是keil5.28,单片机用的是STM32F103RCT6。 移植到VET6以及ZET6的话只需要改一下选择的芯片就好,改法:

qq_40305944的博客 8万+

裁剪序列

给定一个长度为 N 的序列 A ,要求把该序列分成若干段,在满足“每段中所有数的和”不超过M的前提下,让“每段中所有数的最大值”之和最小。 试计算这个最小值。 输入格式 第一行包含两个整数N和M。 第二行包含N个整数,表示完整的序列A。 输出格式 输出一个整数,表示结果。 如果结果不存在,则输出-1。 数据范围 0≤N≤10^5, 0≤M≤10^11, 序列A中的数非负,且不超过10^6 输入样例...

sky123博客 697

使用LabVIEW创建和分析柱状图:从基础绘制到高级数据分析的完整指南

LabVIEW,全称为Laboratory Virtual Instrument Engineering Workbench,是由美国国家仪器公司(National Instruments, NI)开发的一款图形化编程语言。自1986年首次推出以来,LabVIEW凭借其强大的数据采集、分析和控制能力,在工程、科研、教育等领域得到了广泛应用。与传统的文本编程语言不同,LabVIEW采用了图形化编程方式,用户通过连接不同的函数节点来实现复杂的逻辑和算法。

qq_38334677的博客 774

【OpenCV】图像的像素直方图 图像特征点 cv::FAST cv::ORB ORB_SLAM2::ORB

文章目录图像直方图代码实现cv::FAST和cv::ORB 检测图像特征点cv::FAST和cv::ORB 检测图像特征点代码实现ORB_SLAM2::ORB和自己实现ORB图像特征点检测效果对比ORB_SLAM2::ORB和自己实现ORB图像特征点检测效果对比代码实现 图像直方图代码实现 图像是由不同数值(颜色)的像素构成的,像素值在图像中的分布情况是图像的重要属性,可以用直方图修改图像的外观,标识图像的内容,检测图像中特定的物体或纹理。 单通道灰度图像中每个像素都有一个 0(黑色)-255(白色)的整

小秋 AI SLAM 入门实战教程 2509

poj3017 Cut the Sequence 单调队列优化dp 好题!

Language: Default Cut the Sequence Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 8766   Accepted: 2578 Description Given an integer sequence { an } of

AC_kereo的专栏 2933

Opencv计算机视觉PPT-算法篇

01 02 03 04 05 06 07 08 09 010 011 012 013 014 015 016 017 018

Qt历险记,专注Qt技术,三年医疗设备研发经验,1年机器视觉研发经验,半年柔性传感研发经验。 203

Cut the Sequence,Sequence Partitioning,POJ3017,POJ3245,用单调队列优化的DP

为什么这两题要放到一起说呢,主要是这两题十分类似,用单调队列优化的方法是一样的,所以放在一起总结会比较印象深刻。 先说POJ3017----------Cut the Sequence 题目地址:http://poj.org/problem?id=3017 题目意思: 给你N个数和一个值M 可以将这N个数分成任意段,使得每段的和不大于M 要你使得每段的最大值加起来的和最小,求这个最小值

Bob Lee's Blog For CS 1136

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

POJ 3017 Cut the Sequence (单调队列优化DP)

POJ 3017 Cut the Sequence (单调队列优化DP) ACM 题目地址:  POJ 3017 Cut the Sequence 题意:  将一个由N个数组成的序列划分成若干段,要求每段数字的和不超过M,求【每段的最大值】的和 的最小的划分方法,输出这个最小的和。 分析:  方程是:dp[i] = min(dp[j]+maxsum[j+1][i]) 

水果君の日常 3239

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

POJ 3017 Cut the Sequence 【DP+单调队列优化+平衡树】

题意 给定一串数列,要求把它划分成一些小段,每个小段的和不超过M,找到一种分段方法使得每一段的最大值的和最小,求这个最小值 分析 易得转移方程 dp[i]=min(dp[k]+max(num[k+1],⋯,num[i])) 其中∑ij=k+1num[j]<=M,朴素的做法显然是O(n2)的。观察可得dp数组是递增的,然后对于一个确定的分段最大值,以...

a18235146924的博客 223

[dp单调队列+堆优化] poj3017 Cut the Sequence

link 题面 $   给定一个数组 a, 要把它分成若干段,让每一段的和不超过 mmm ,求每一段的最大值之和最小是多少。 分析   朴素的 dpdpdp 比较容易想到。   定义 dp[i]dp[i]dp[i] 表示从 a[1:i]a[1:i]a[1:i] 分成若干段的 最小 最大值之和,i0i_0i0​ 表示 sum a[i0,i]>m, sum a[i0+1,i]≤msum \ a[i_0, i] > m, \ sum \ a[i_0 + 1, i]

ECNU_SF的博客 409

POJ - 3017 Cut the Sequence(单调队列优化DP)

POJ - 3017 Cut the Sequence(单调队列优化DP) 1.题意: 给定一个长度为 NNN (N≤1e5)(N≤1e5)(N≤1e5)的序列 AAA ,要求把该序列分成若干段,在满足“““每段中所有数的和”””不超过MMM的前提下,让“““每段中所有数的最大值”””之和最小。 2.分析 朴素DP: 状态:设f[i]表示将前i个数分为若干段,每段和不超过m时,最大值之和的最小值。 转移方程: f[i]=min(f[j]+max(a[j+1],a[j+2],......a[i]))(∑k

00后的博客 604

Poj 3017 Cut the Sequence (DP,单调队列优化,数据结构优化)

题目链接:poj 3017 论暴力姿势的优雅性。 这道题直接用单调队列的大暴力居然过了,而且跑得很快。正解的话应该是用数据结构维护。时间复杂度为NlogN。 先粘一个用单调队列优化的DP #include #include #include using namespace std; #define LL long long #define inf (1e18) const int m

顺 815

POJ - 3017 Cut the Sequence : 单调队列优化dp

题目点此跳转思路 题目意思是给你一个数组, 现在让你将整个数组划分为几个子区间,并且要保证每个子区间的元素和不大于M, 求 每个子区间的最大值 的和 的最小值。 这是一道dp题, 单调队列的一个很大的应用就是可以优化某一类dp。  我们先将它当作一个纯dp题去写状态转移方程,之后再考虑使用单调队列优化。 设 f(i) 为数组A[1, , i]满足条件的每个子区间的最大值的和 的最小值, 则要求的结

duaduac.com 675

poj3017 dp+单调队列

http://poj.org/problem?id=3017 Description Given an integer sequence { an } of length N, you are to cut the sequence into several parts every one of which is a consecutive subsequence of the ori

ACM,再见! 1127

poj 3017 单调队列优化DP

这是看了论文之后来做的。。。。 但是论文上有个地方没

马德里小铁匠的铁匠铺 645

poj 3017 dp+单调队列优化

/* 题意:给你一个长度为n的数列,要求把这个数列划分为任意块,每块的元素和小于m,使得所有块的最大值的和最小 分析:这题很快就能想到一个DP方程 f[ i ]=min{ f[ j ] +max{ a[ k ] }}( b[ i ]<j<i,j<k<=i) b[ i ]到 i的和大于m 这个方程的复杂度是O(n^2),明显要超时的(怎么discuss都说数据弱呢= =) 然后是优化了,首先

天逸南爵的专栏 2054

[poj3017]Cut the Sequence——单调队列优化DP

题目大意: 给定一个长度为n的序列和整数m,求一个划分使得每一段的和不大于m且每一段的最大值的和最小。 思路: 设dp[i]为前i个的最小和,方程显而易见: dp[i]=min(dp[j]+max(a[j+1]...a[i]))dp[i]=min(dp[j]+max(a[j+1]...a[i]))dp[i]=min(dp[j]+\max(a[j+1]...a[i])) 朴素的时间复杂...

ylsoi的博客 301

poj 3017 Cut the Sequence(单调队列优化DP)

Cut the Sequence \(solution:\) 这道题出的真的很好,奈何数据水啊! 这道题当时看得一脸懵逼,说二分也不像二分,说贪心也不像贪心,说搜索吧这题数据范围怎么这么大?而且这题看起来也实在不好DP,当时是真的满头雾水。只能说是各个都尝试一下。最后还是选了DP来做第一步突破,因为这道题可以用最优子结构来推出最优答案,也符合常规DP套路即设 \(F[i][j]\) 表示将前...

weixin_30576827的博客 183
上一篇: 省选校内模拟D8
下一篇: 省选校内模拟D10
ShɑΙteж
博客等级 码龄9年 20粉丝 152原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值