Problem1141--斜率优化4

1141: 斜率优化4

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 1  Solved: 1
[Status] [Submit] [Creator:]

Description

【题目描述】
    有n个数,分成连续的若干段,每段的分数为a*x^2+b*x+c(a,b,c是给出的常数),其中x为该段的各个数的和。求如何分才能使得各个段的分数的总和最大。
【输入格式】 
第1行:1个整数N (1 <= N <= 1000000)。
第2行:3个整数a,b,c(-5<=a<=-1,|b|<=10000000,|c|<=10000000
    下来N个整数,每个数的范围为[1,100]。 
【输出格式】 
    一个整数,各段分数总和的值最大。 
SAMPLE INPUT 
4
-1 10 -20
2 2 3 4
SAMPLE OUTPUT 
9

HINT

练习:

HDU3507 斜率优化DP例题 1.5 
HDU2993 同例题,定义s[i]=a1+a2+...+ai,f[i]=         其实是个斜率,如果点i为(i,s[i]),那就是i、j两点间的斜率   具体点的文件夹里有 2.5 超级无语,hdu有问题,谁都TLE,读入优化都过不了,不过可以先学一下读入优化(我代码打了),我只好自己出了数据....注意细节!
HDU3045 先对n个数进行排序,则可以分析出分组成员一定是连续的 排个序之后就知道f[i]=min(f[j]+s[i]-s[j+1]-(i-j)*a[j+1]) 自己变式 3 
HDU3480 我尽量没有简化题意目的就是为了让你发现很明显的事实:一个数只会出现一次 所以进行排序之后用斜率优化做就好了 3 做法上差不多,也就是变成了二维而已
bzoj1010 "dp[i]=min(dp[j]+(sum[i]-sum[j]+i-j-1-L)^2) (j<i)
令f[i]=sum[i]+i,c=1+l
则dp[i]=min(dp[j]+(f[i]-f[j]-c)^2)" 3.5 过程略烦,细心点,hzw大神写的很好,有不懂地方就去看看http://hzwer.com/2114.html
HDU2829 定义dp[i][j]表示将前j个数分成i组所得到的价值,sum[i]表示前i个数之和,w[i]表示前i个数分成一组的价值,最后化简结果就是  dp[i][j]=min{dp[i-1][k] - w[k] + sum[k]*sum[k] - sum[k]*sum[j]} + w[j] (i-1<=k<j). 3.5 一样的,列出方程,转化为斜率优化的样子搞就好了,我没给一开始的方程以及化简,就是让你自己要亲自列出来然后化简一下啊(就是过程烦了点)
bzoj1096 方法一样,方程这次自己写吧~(自己列才有锻炼意义) 4 实在不行再找题解吧

 

Source/Category