題目大意:
給定乙個大小為n的陣列,求將它分為k段,每段和與長度的積的和的最小值。
n<=8000,k<=800
題目解法:
首先可以想到dp狀態f(j,i)表示前i個分為j段的最小值。
f(j,i)=min,其中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· 四邊形法則
若代價滿足四邊形法則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)
LintCode 陣列劃分
給出乙個整數陣列nums和乙個整數k。劃分陣列 即移動陣列nums中的元素 使得 返回陣列劃分的位置,即陣列中第乙個位置i,滿足nums i 大於等於k。您在真實的面試中是否遇到過這個題?yes 樣例給出陣列nums 3,2,2,1 和 k 2,返回 1 注意你應該真正的劃分陣列nums,而不僅僅只...
LintCode 陣列劃分
陣列劃分 給出乙個整數陣列nums和乙個整數k。劃分陣列 即移動陣列nums中的元素 使得 所有小於k的元素移到左邊 所有大於等於k的元素移到右邊 返回陣列劃分的位置,即陣列中第乙個位置i,滿足nums i 大於等於k。樣例 給出陣列nums 3,2,2,1 和 k 2,返回 1 注意 你應該真正的...
LintCode 陣列劃分
給出乙個整數陣列 nums 和乙個整數 k。劃分陣列 即移動陣列 nums 中的元素 使得 所有小於k的元素移到左邊 所有大於等於k的元素移到右邊 返回陣列劃分的位置,即陣列中第乙個位置 i,滿足 nums i 大於等於 k。class solution param nums the integer...