#0012. 数组划分1
题目大意:
给定一个大小为n的数组,求将它分为k段,每段和与长度的积的和的最小值。
n<=8000,k<=800
题目解法:
首先可以想到dp状态f(j,i)表示前i个分为j段的最小值。
f(j,i)=min{f(j-1,k)+w(k,i)},其中w(k,j)显然可以通过前缀和的处理O(1)得到。
直接转移的复杂度是O(n^2*k)。我们考虑分治优化。
//一开始写题解的时候满脑子想的最大值很多地方写错了如果有啥还没改对的地方欢迎纠正
· 决策点的单调性
每个f(j,i)都是从一个f(j-1,k)转移过来的。我们令d(j,i)=k。
若满足d(j,i)<=d(j,i'),其中i<i',则称决策点具有单调性
· 四边形法则
若代价满足四边形法则w(a,c)+w(b,d)<=w(a,d)+w(b,c),其中a<=b<=c<=d -> 决策点具有单调性
反证:假设最优的f[c], f[d]分别是从g[b], g[a]转移过来的 (a<=b, c<=d)
因为f[c],f[d]均为最优且相互独立,f[c]+f[d]应当尽可能小(否则f[c] f[d]中一定有一个可以取到更小的值)。
由于代价满足四边形法则,f[c]+f[d]=g[a]+g[b]+w(b,c)+w(a,d)>=g[a]+g[b]+w(a,c)+w(b,d),
f[c],f[d]分别从g[a], g[b]转移过来所得到的f[c]+f[d]的值比从g[b], g[a]转移来更小,因此分别从g[b], g[a]转移过来的f[c], f[d]一定没有同时取到最优,矛盾。
本题w显然满足四边形法则(两者的区别无非是把[c,d]接到a后面还是b后面,而显然往短的后面接是最小的)
显然,对于第i层仅需要第i-1层的dp值,且每层的决策点都是具有单调性的,可以分治优化,具体步骤如下:
solve(l,r,optl,optr)解决的是第i层f(i,[l,r])的dp值,且目前我们知道这些位置的决策点在[optl,optr]这个范围内。
(那么一开始显然就是solve(i,n,0,n-1)
对于每一个solve,我们遍历所有[optl,optr]范围内的决策点暴力求出中点mid(l+r>>1)的决策点optmid。这样mid左边决策点范围就是[optl,optmid],同理右边决策 点范围就是[optmid,optr],对两边递归求解即可。显然我们最多递归log n层,每层最多遍历n个点,复杂度是O(n*logn)。总的复杂度为O(k*n*logn)

浙公网安备 33010602011771号