環形石子歸併

2021-10-23 03:37:15 字數 1311 閱讀 8165

題目鏈結

先分享下我寫這個題目的過程

首先,沒讀懂題目…因為就是乙個鏈式的歸併,然後,很明顯…

測試樣例最小是44…

然後就看題解嘛,然鵝並不能看懂 …

不過我自己就有了乙個新的想法

我的想法:

眾所周知:

基於此,我們就可以發現,我們只要維護不同鏈的字首和就可以完成對不同鏈的歸併

時間複雜度是o(n^4),n<100,可以在1s內完成.

其他的題解複雜度可能低些,但是沒我**簡單易懂233

#include

using

namespace std;

const

int n =

1000

;int n, p[n]

, dp[n]

[n], dpt[n]

[n];

int sum[n]

;const

int inf =

0x3f3f3f3f

;int

main()

//更新字首和

// cout << endl;

memset

(dp,0,

sizeof

(dp));

memset

(dpt, inf,

sizeof

(dpt));

//記得每次都要清空dp陣列

for(

int i =

1; i <= n; i++

) dpt[i]

[i]=0;

for(

int i = n -

1; i >=

1; i--

)//裸的鏈式石子歸併

for(

int j = i +

1; j <= n; j++

)for

(int k = i; k <= j -

1; k++

)//cout << dp[1][n] << "\t" << dpt[1][n] << endl;

if(imax < dp[1]

[n])

imax = dp[1]

[n];

if(imin > dpt[1]

[n])

imin = dpt[1]

[n];

} cout << imin << endl

<< imax << endl;

return0;

}

題解 環形石子歸併問題

問題很經典,在乙個圓形操場的四周擺放著 n n 堆石子。現要將石子有次序地合併成一堆。規定每次只 能選相鄰的2 堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的得分。試設計乙個演算法,計算出將 n role presentation style position relative n n堆石子...

環形區間DP 環形石子合併

在乙個園形操場的四周擺放n堆石子,現要將石子有次序地合併成一堆.規定每次只能選相鄰的2堆合併成新的一堆,並將新的一堆的石子數,記為該次合併的得分。試設計出1個演算法,計算出將n堆石子合併成1堆的最小得分和最大得分.輸入輸出格式 輸入格式 資料的第1行試正整數n,1 n 100,表示有n堆石子.第2行...

環形石子合併問題

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