問題很經典,
在乙個圓形操場的四周擺放著
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...