hdu3507】的更多相关文章

题意 https://cn.vjudge.net/problem/HDU-3507 分析 斜率优化的模板题 #include <cstdio> #include <cstring> #include <algorithm> #include <iostream> using namespace std; typedef long long LL; +; int n,m; int c[maxn],sum[maxn],f[maxn],q[maxn]; int h…
hdu3507 题意 给出 N 个数字,输出的时候可以选择连续的输出,每连续输出一串,它的费用是 这串数字和的平方加上一个常数 M. 分析 斜率优化dp,入门题. 参考 参考 得到 dp 方程后,发现是O(n * n)的复杂度,且 n 很大,考虑用斜率优化. 设 s[i] 为 1 到 i 的花费之和. dp方程:\(dp[i] = dp[j] + (s[i] - s[j])^2 + m ( i > j)\) 如果选 j 比选 k 更优,则有 \(dp[j] + (s[i] - s[j])^2 +…
题目链接:https://vjudge.net/problem/HDU-3507 Print Article Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 14899    Accepted Submission(s): 4648 Problem Description Zero has an old printer that doe…
参考博文:http://www.cnblogs.com/ka200812/archive/2012/08/03/2621345.html//讲的真的很好,有个小错误,博客里的num全为sum,像我这种弱渣都听懂了.真心点赞!!! Print Article Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 7976    Accepted…
题目大意:有N个数字a[N],每输出连续的一串,它的费用是 “这行数字的平方加上一个常数M”.问如何输出使得总费用最小.(n<=500000) 分析:动态规划方程为:dp[i]=dp[j]+M+(sum[i]-sum[j])^2: 右边有一项为:sum[i]*sum[j].考虑用单调队列. 令dp[i]=g,dp[j]+M+sum[i]^2+sum[j]^2=y,sum[j]=y,2*sum[i]=k 则上式变为g=y-kx,即y=kx+g.此为直线方程. 我们要使得g最小,即可以考虑有一条斜率…
前几天做多校,知道了这世界上存在dp的优化这样的说法,了解了四边形优化dp,所以今天顺带做一道典型的斜率优化,在百度打斜率优化dp,首先弹出来的就是下面这个网址:http://www.cnblogs.com/ka200812/archive/2012/08/03/2621345.html 上面讲的很详细,但是实际上有些地方貌似是不小心写错了,所以我也来复述一下感悟一下收获. 首先题意是比较明确的,如果我们定义dp[i]为打印到第i个字符时的最小花费的话,显然有下面的转移: dp[i]=dp[j]…
题意: 给n(n<=10^6)个非负数字,放在一个数组num中,再给一个特殊值m.求将这个数组分成任意多个区间,每个区间[a,b]的值定义为( sigma(num[i] | (a<=i<=b)) ) ^ 2 + m.要区间值总和最小,并输出此最小值 (PS:这道题不用考虑暴int问题,当然这是AC以后才发现的). 解题思路: 定义sum[i]=sigma(num[j] | (1<=j<=i)) (这里假设num数组下标从1开始) 定义f(j,i) = (sum[i]-sum[…
Zero has an old printer that doesn't work well sometimes. As it is antique, he still like to use it to print articles. But it is too old to work for a long time and it will certainly wear and tear, so Zero use a cost to evaluate this degree. One day…
pid=3507">传送门 大意:打印一篇文章,连续打印一堆字的花费是这一堆的和的平方加上一个常数M. 首先我们写出状态转移方程 :f[i]=f[j]+(sum[i]−sum[j])2+M;f[i] = f[j] + (sum[i] - sum[j])^2 + M; 设 j 优于 k. 那么有 f[j]+(sum[i]−sum[j])2<f[k]+(sum[i]−sum[k])2f[j] + (sum[i] - sum[j])^2 移项得出 (f[j]+sum[j]2)−(f[k]+…
Print Article Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) Problem Description Zero has an old printer that doesn't work well sometimes. As it is antique, he still like to use it to print articles. But it is to…
Print Article Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 11761    Accepted Submission(s): 3586 Problem Description Zero has an old printer that doesn't work well sometimes. As it is antiqu…
题目大意:将n个数分成若干个区间,每个区间的代价为区间和的平方加上一个常数m,求最小代价. 题目分析:定义状态dp(i)表示前 i 个数已经分好的最小代价,则状态转移方程为 dp(i)=min(dp(j)+(sum(j)-sum(i))^2)+m   <1>.将这个方程整理一下得到: dp(i)=min(-2*sum(i)*sum(j)+dp(j)+sum(j)^2)+sum(i)^2+m   <2>. 设函数f(i)=-2*sum(i)*sum(j)+dp(j)+sum(j)^2…
传送门 这应该算是斜率优化的模板题了. 就是要求打印n个数,每个数有一个参数a[i],每打印一段连续的数[l,r]需要的花费是(a[[l]+...+a[r])2+m" role="presentation" style="position: relative;">(a[[l]+...+a[r])2+m(a[[l]+...+a[r])2+m,要使得打印出所有数的代价最小. 用dp[i]表示打印1~i用的最小代价,显然有dp[i]=min(dp[j]+m…
Problem Description Zero has an old printer that doesn't work well sometimes. As it is antique, he still like to use it to print articles. But it is too old to work for a long time and it will certainly wear and tear, so Zero use a cost to evaluate t…
打印文章 时间限制:9000/3000 MS(Java / Others)内存限制:131072/65536 K(Java / Others) 总共提交:14521已接受提交:4531 问题描述 零有一台旧的打印机,有时不能正常工作.由于它是古董,他仍然喜欢用它来打印文章.但是长时间工作太旧,肯定会磨损,所以用零成本来评价这个程度. 有一天,零想要打印一个有N个单词的文章,而每个单词我有一个打印费用Ci.另外,零知道在一行中打印k个字将花费 M是常数. 现在,零想要知道最低成本,以完美安排文章.…
放一手原题 题解: 第一次写(抄)斜率优化,心里还是有点小激动的.讲一下怎么实现的! 首先我们可以考虑一个朴素的dp:DP[i]表示前i个数字的最少花费,显然我们有一个转移方程 DP[i]=min{DP[j]+M+(sum[i]-sum[j])^2} 但是N^2肯定会超时,我们考虑优化他 假设有k<j<i,如果令j对i的贡献比k好 显然我们有这样的式子 DP[j]+M+(sum[i]-sum[j])^2 < DP[k]+M+(sum[i]-sum[j])^2 把平方打开之后移项 可以得到…
Description 题意:给N个数,按顺序全部取走,每次取一段连续的区间,代价为\((S[i]-S[j])^2+M\) 其中M为一个给定的常数,\(S[i]\)为前缀和 \(N\leq 500000\) Solution 常规的方程:\(dp[i]=min\{dp[j]+(S[i]-S[j])^2+M\}, j<i\) \(O(n^2)\)是过不了50万的,用斜率优化 设有\(k<j<i\) 使得决策j更优,那么有 \(dp[j]+(S[i]-S[j])^2+M<dp[k]+(…
单调队列DP复出练手题 朴素方程dp[i]=min(dp[j]+(s[i]-s[j-1])^2+m 你懂得 ..]of int64; a,q:array[..]of longint; n,m,i,t,w:longint; function sum(x,y:longint):int64; begin exit(s[y]-s[x-]); end; function clac(j,i:longint):int64; begin exit(dp[j]+sqr(sum(j+,i))+m); end; fu…
传送门 题意: 现有\(n\)个数,每个数的值为\(a_i\),现在可以把数划分为多段,每一段的代价为\((\sum_{k=i}^{j}c_i)^2+M\). 问怎么划分,代价最小. 思路: 考虑dp,那么dp式子很简单: \[ dp(i)=min\{dp(j)+(S_i-S_j)^2+M\} \] 注意这种\(dp\)形式,后面加上的部分与\(i,j\)两个变量有关,这种一般可以考虑分离变量然后斜率dp优化. (PS.如果可以分为多个部分,每个部分只和一个有关,那么可以考虑单调队列优化.fro…
题意:需要打印n个正整数,1个数要么单独打印要么和前面一个数一起打印,1次打印1组数的代价为这组数的和的平方加上常数M.求最小代价. 思路:如果令dp[i]为打印前i个数的最小代价,那么有 dp[i]=min(dp[j]+(sum[i]-sum[j])2+M),j<i 直接枚举转移是O(n2)的,然而这个方程可以利用斜率优化将复杂度降到O(n). 根据斜率优化的一般思路,对当前考虑的状态i,考虑决策j和k(j<k),如果k比j优,那么根据转移方程有:dp[k]+(sum[i]-sum[k])2…
QWQ菜的真实. 首先来看这个题. 很显然能得到一个朴素的\(dp\)柿子 \[dp[i]=max(dp[i],dp[j]+(sum[i]-sum[j])^2) \] 但是因为\(n\le 500000\),所以\(n^2\)一定是过不了的. 考虑应该怎么优化. 考虑什么时候存在一个\(j>k且j比k更优秀\) \[dp[j]+(sum[i]-sum[j])^2<dp[k]+(sum[i]-sum[k])^2 \] 我们进行化简 \[2\times s[i] \times (s[j]-s[k]…
状态表示:dp[i]表示打印前i个单词的最小成本:s[i]维护前缀和. 状态转移:dp[i]=min(dp[j]+(s[i]-s[j])2)+m , 0<=j<i. 换成y=kx+b的形式:dp[j]+s[j]2=2*s[i]*s[j]+dp[i]-s[i]2-m. 算法步骤:1.枚举i=1...n,k=2*s[i]. 2.检查单调队列队头,排除决策.. 3.此时队头就是最优决策j,根据方程计算dp[i]. 4.加入新决策i,检查下凸性,删除队尾直至满足下凸性. 5.最优解为dp[n]. 1…
首先得讲一下单调队列,顾名思义,单调队列就是队列中的每个元素具有单调性,如果是单调递增队列,那么每个元素都是单调递增的,反正,亦然. 那么如何对单调队列进行操作呢? 是这样的:对于单调队列而言,队首和队尾都可以进行出队操作,但只有队尾能够进行入队操作. 至于如何来维护单调队列,这里以单调递增队列为例: 1.如果队列的长度是一定的,首先判断队首元素是否在规定范围内,如果不再,则队首指针向后移动.(至于如何来判断是否在制定范围内,一般而言,我们可以给每个元素设定一个入队的序号,这样就能够知道每个元素…
常见优化 单调队列 形式 dp[i]=min{f(k)} dp[i]=max{f(k)} 要求 f(k)是关于k的函数 k的范围和i有关 转移方法 维护一个单调递增(减)的队列,可以在两头弹出元素,一头压入元素. 队列中维护的是两个值.一个是位置,这和k的范围有关系,另外一个是f(k)的值,这个用来维护单调性,当然如果f(k)的值可以利用dp值在O(1)的时间内计算出来的话队列中可以只维护一个表示位置的变量. 枚举到一个i的时候,首先判断队首元素的位置是否已经不满足k的范围了,如果不满足就将队首…
可以用队列优化或斜率优化的dp这一类的问题为 1D/1D一类问题 即状态数是O(n),决策数也是O(n) 单调队列优化 我们来看这样一个问题:一个含有n项的数列(n<=2000000),求出每一项前面的第m个数到它这个区间内的最小值 可以使用RMQ求区间最小值,那么时间复杂度是O(nlogn),不是让人很满意. dp[i]为i-m+1->i这个区间的最小值. 那么状态转移方程是 可以看出,这个题目的状态数是O(n),决策数是O(m),且决策的区间是连续的,那么可以尝试想办法把O(m)优化成O(…
题目链接:http://poj.org/problem?id=1180 Description There is a sequence of N jobs to be processed on one machine. The jobs are numbered from 1 to N, so that the sequence is 1,2,..., N. The sequence of jobs must be partitioned into one or more batches, wh…
此篇收集各类DP题. <1D1D动态规划优化初步>的3个模型 1. f[x] = min(f[i]+w[i, x]), i < x且w[i, x]满足单调性(即w[i, j]+w[i+1, j+1] <= w[i, j+1]+w[i+1, j],下四边形同) 2. f[x] = min(g[i])+w[x], b[x] <= i < x, b[x]单调递增 3. f[i]=max{x[j]*a[i]+y[j]*b[i]} = b[i]*max{a[i]/b[i]*x[j…
前言 为了不久之后的\(NOIP2018\),我们的停课从今天(\(Oct\ 24th\))起正式开始了. 本来说要下周开始的,没想到竟提早了几天,真是一个惊喜.毕竟明天有语文考试.后天有科学考试,逃过了一劫. 这篇博客记录的便是停课这段时间的经历. 当然,这篇博客中有许多空链接,请谅解. \(Oct\ 24th\) 上午 一场\(NOIP2018\)线下模拟赛,\(AC\)了\(T1\)和\(T3\),\(T2\)悲惨爆\(0\)... .. 下午 花了一个下午写一道\(KD-Tree\)板子…
1.HDU3507 裸题,有助于理解斜率优化的精髓. dp[i]=min(dp[j]+m+(sum[i]-sum[j])2) 很显然不是单调队列. 根据斜率优化的的定义,就是先设两个决策j,k 什么时候我们认为在 i 的环境下 j 比 k 好呢?根据上面的递推式,得到下面这么一个式子 dp[j]+m+(sum[i]-sum[j])2<dp[k]+m+(sum[i]-sum[k])2 打开括号: dp[j]+m+sum[i]2+sum[j]2-2*sum[i]*sum[j]<dp[k]+m+su…
学习:https://blog.csdn.net/bill_yang_2016/article/details/54667902 HDU-3507 题意:有若干个单词,每个单词有一个费用,连续的单词组合成一块有花费:(∑Ci)^2+M,问如何分单词,使得这些花费和最小. 思路:dp,但是由于数据n = 5e5,所以需要利用斜率优化dp,维护一个下凸包. 大佬的分析:http://www.cnblogs.com/ka200812/archive/2012/08/03/2621345.html: #…