题目描述
原题来自:HDU 3507
给出 N 个单词,每个单词有个非负权值 Ci,现要将它们分成连续的若干段,每段的代价为此段单词的权值和的平方,还要加一个常数 M,即 (∑Ci)2+M。现在想求出一种最优方案,使得总费用之和最小。
输入格式
包含多组测试数据,对于每组测试数据:
第一行包含两个整数 N 和 M。
第二行为 N 个整数。
输出格式
输出仅一个整数,表示最小的价值。
5 5
5 9 5 7 5
230
数据范围与提示
对于全部数据,0≤N≤5×105, 0≤M≤1000。
dpi=min(dpi,dpj+(s[i]−s[j])2+m)
对于 j<k<i,如果 k 比 j 要优,则满足 :
$$dp[k]+s[i]^2-2s[i]s[k]+s[k]^2+m ≤ dp[j]+s[i]^2-2s[i]s[j]+s[j]^2+m
$$
消去一样的可得
dp[k]−2s[i]s[k]+s[k]2≤dp[j]−2s[i]s[j]+s[j]2
移项可得
dp[k]+s[k]2−dp[j]−s[j]2≤2s[i](s[k]−s[j])
所以可知当 j<k<i,dp[k]+s[k]2−dp[j]−s[j]2≤2s[i](s[k]−s[j]) 时 k 比 j 优。
设 Slope(j,k) 表示 $\text{Slope}(j,k)=\cfrac{(dp[k]+s[k]^2)-(dp[j]+s[j]^2)}{2s[i](s[k]-s[j])}$
当Slope(j,k)≥Slope(k,i),k 就没用了