POJ3017】的更多相关文章

http://poj.org/problem?id=3017 (题目链接) 题意 给出一个数列要求将它分割成许多块,每块的数的和不超过m,要求每块中最大的数之和最小. Solution 这道题真的很不错啊. 可以很快写出dp方程:${f[i]=min(f[j]+max(a[j+1],a[j+2]···a[i]))}$.数据范围太大,我们必须要想办法优化这个方程.${O(n)}$的状态肯定是没办法优化到${O(1)}$了,想想怎么把转移优化到${O(logn)}$甚至${O(1)}$呢?似乎完全不…
DP + 单调队列优化 + 平衡树 好题 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 original sequence. Every part must satisfy that the sum of the intege…
题目链接:http://poj.org/problem?id=3017 这题的DP方程是容易想到的,f[i]=Min{ f[j]+Max(num[j+1],num[j+2],......,num[i]) | 满足m的下界<j<=i },复杂度O(n^2),妥妥的TLE.其实很多都决策都是没有必要的,只要保存在满足m的区间内,num值单调递减的的那些决策.如果遍历的话,一个下降的序列会退化到O(n^2),于是用堆来优化...堆优化这里,纠结了很久T_T,,,网上很多代码都是直接用set来处理,但…
题意 Language:Default Cut the Sequence Time Limit: 2000MS Memory Limit: 131072K Total Submissions: 12238 Accepted: 3809 Description Given an integer sequence { an } of length N, you are to cut the sequence into several parts every one of which is a con…
题目大意:给定一个长度为 N 的序列,将序列划分成若干段,保证每段之和不超过 M,问所有段的最大值之和最小是多少. 题解:设 \(f[i]\) 表示前 i 个数满足上述条件的最优解,显然有状态转移方程\[f[i]=min\{f[j]+max_{j+1\le k \le i}\{a[k]\}\}\],发现若能够在 \(O(1)\) 的时间内求得静态区间最小的 a 值,则时间复杂度为 \(O(n^2)\). 可以发现,这个算法复杂度的瓶颈是每次都需要枚举 j 来做状态转移,于是观察递推式的结构,由于…
描述 把一个正数列 $A$分成若干段, 每段之和 不超过 $M$, 并且使得每段数列的最大值的和最小, 求出这个最小值. 题目链接 题解 首先我们可以列出一个$O(n^2)$ 的转移方程 : $F_i = \min( F_j + \max( A_k ) )  $ $ j < i  \&\&   j < k <= i$ 然后我们可以考虑毒瘤优化. 按照lyd的书中的思路, j 想要成为 可能的最优决策, 必须满足两个条件之一 : j 是最小的使    $\sum\limit…
题意 将一段序列分割为任意段,每一段的连续和不超过M,使得每一段最大值的和最小. 分析 用单调队列进行优化的dp.单调队列可以维护可以影响当前区间的最大值. #include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <queue> using namespace std; +; int a[maxn]; long long f[ma…
这里已经讲得很清楚了. 本質上是決策點與區間最大值有一定關係,於是用单调队列来维护决策集合(而不是常规的),然后在决策集合中选取最小值. 然后觉得这题方法还是很重要的.没写平衡树,用优先队列(堆)来维护,单调队列维护最大值删除元素时用vis标记一下,取优先队列首的时候判断有没有被标记过,是的话就扔掉重复此动作. 然后最左端是特例,特殊对待就行了.具体还看上面↑. 错误:很智障的把m数据类型定义为int..结果查半天才发现是类型不对. #include<iostream> #include<…
Poj   AcWing Description 给定一个长度为N的序列 A,要求把该序列分成若干段,在满足“每段中所有数的和”不超过M的前提下,让“每段中所有数的最大值”之和最小. N<=105,M<=1011,0<Ai<=106 Sol 一篇比较清楚的题解 $OvO$ $F[i]$表示把前$i$个数分成若干段,满足每段中所有数之和不超过$M$的前提下,各段的最大值之和的最小值 不难推出转移方程: 但是直接枚举$j$的做法是$O(N^{2})$的,显然过不去,还要优化. DP转移…
传送门 解题思路: 大力推公式:dp[i]=min(dp[k]+max(k+1,i)){k>=0&&k<i},max(j,i)记为max(a[h]){h>k&&h<=i},时间复杂度o(n^2)跑不动.考虑有什么冗余的决策可以优化,j到i的累加和记做sum(j,i),所以题目要保证sum(k+1,i)<=m(m为连续子序列和的上限). 贪心的去想: 第一种情况如果确定max(j,i)==a[j],那么j可以作为一个可能的决策. 第二种情况如果确…