題解 環形石子歸併問題

2021-08-18 13:56:50 字數 852 閱讀 3399

問題很經典,

在乙個圓形操場的四周擺放著

n n

堆石子。現要將石子有次序地合併成一堆。規定每次只

能選相鄰的2 堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的得分。試設計乙個演算法,計算出將

n' role="presentation" style="position: relative;">n

n堆石子合併成一堆的最小得分和最大得分。

這道題是經典的環形dp,看到網路上一堆da

lao dal

ao

都是使用了f(

i,j)

f (i

,j

)表示從i開始,順時針合併j堆所得的最小的得分(最大得分一會兒說)。我就寫乙個用f(

i,j)

f (i

,j

)表示從i合併到j所得的最小的得分。狀態轉移方程也很好想:f(

i,j)

= for (int i = n + 1; i <= 2 * n; i++)

a[i] = a[n] + a[i - n];

int min = 0x3f3f3f3f, max = -0x3f3f3f3f;

for (int i = 2 * n; i >= 1; i--)

for (int j = i + 1; j <= i + n + 1; j++)

for (int k = i; k < j; k++)

for (int i = 1; i <= n; i++)

std::cout

<< min << std::endl << max << std::endl;

return

0;}

環形石子歸併

題目鏈結 先分享下我寫這個題目的過程 首先,沒讀懂題目 因為就是乙個鏈式的歸併,然後,很明顯 測試樣例最小是44 然後就看題解嘛,然鵝並不能看懂 不過我自己就有了乙個新的想法 我的想法 眾所周知 基於此,我們就可以發現,我們只要維護不同鏈的字首和就可以完成對不同鏈的歸併 時間複雜度是o n 4 n ...

環形石子合併問題

環形石子合併問題是在普通的相鄰石子合併問題的基礎上稍加拓展,石子變成了環形的,也就是說每個石子都可能和其左右兩邊的石子合併。那麼它的dp解法也是基於普通的相鄰石子合併問題,不了解的同學可以參考我寫過的這篇文章。有兩種解法,但他們基本的演算法思想是一樣的。第一種是和上面鏈結文章的寫法類似,不同的是對於...

區間dp石子歸併問題

石子歸併 現在有n堆石子,第i堆有ai個石子。現在要把這些石子合併成一堆,每次只能合併相鄰兩個,每次合併的代價是兩堆石子的總石子數。求合併所有石子的最小代價。input 第一行包含乙個整數t t 50 表示資料組數。每組資料第一行包含乙個整數n 2 n 100 表示石子的堆數。第二行包含n個正整數a...