題目鏈結
先分享下我寫這個題目的過程
首先,沒讀懂題目…因為就是乙個鏈式的歸併,然後,很明顯…
測試樣例最小是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解法也是基於普通的相鄰石子合併問題,不了解的同學可以參考我寫過的這篇文章。有兩種解法,但他們基本的演算法思想是一樣的。第一種是和上面鏈結文章的寫法類似,不同的是對於...