题解 P1934 【封印】
由于题目具有无后效性,所以想到用DP来解决。
我们令f[i]表示打破前i层封印消耗元气的最小值,则状态转移方程如下:
f[i]=max{f[i−1]+a[i]*n^2,f[k]+(a[k+1]+a[i])*sum(k+1,i)|0<k+1<i,a[k+1]+a[i]≤k}
状态转移方程写好后,问题在于求sum(k+1,i)时如果遍历一遍需要O(n)的复杂度。这样总复杂度为k(n^3),50-70分。
这个复杂度可以用预处理前缀和的方法来优化。用S[i]表示从a[1]到a[i]的
总和,则sum(k+1,i)=S[i]-S[k]。这样总复杂度为k(n^2),可以通过所有测试点。