中等 動態規劃經典 堆石子問題

2021-08-07 06:39:47 字數 794 閱讀 3775

1. 問題描述:

設有n堆沙子排成一排,其編號為1,2,3,…,n(n<=100)。每堆沙子有一定的數量。現要將n堆沙子並成為一堆。歸併的過程只能每次將相鄰的兩堆沙子堆成一堆,這樣經過n-1次歸併後成為一堆。找出一種合理的歸併方法,使總的代價最小。

【輸入格式】

輸入由若干行組成,第一行有乙個整數,n(1≤n≤100);表示沙子堆數。第2至m+1行是每堆沙子的數量。 

【輸出格式】

乙個整數,歸併的最小代價。

【輸入樣例】713

781621418

【輸出樣例】

2392. 解題思路:

首先這也是乙個多階段決策問題,所以考慮採用動態規劃來解。

然後研究一下每個決策(合併還是不合併)受哪個或者哪幾個因素影響。本題可以看作受兩個因素的影響:

(1)要決策的是第 i 堆。

(2)合併的是相鄰的一堆。

如果沒有(2)的話,我們可以大膽採用d[i]來儲存最優值,但因為有了(2),所以這樣就不行了。由(2)我們可以知道合併實際上是與兩堆相關聯的,所以可以根據這兩堆將所有堆分成兩部分,而第一部分又可以繼續分下去,想到這裡,便很容易設計出下面的狀態轉移方程:

d[i][j]=min,其中d[i][j]表示把第i到j堆合併成一堆的最小代價,wi,j表示第i到第j堆的石子數量之和。

有了這個轉移方程,很容易看出要按照長度(即j-i的值)進行迭代求解。

[小優化]

可以提前算出wi,j的值,這樣可以省掉乙個n的時間複雜度。

具體**可以參考:

動態規劃經典問題

from 實現在 維基百科對動態規劃的定義 動態規劃 英語 dynamic programming,簡稱dp 是一種在數學 電腦科學和經濟學中使用的,通過把原問題分解為相對簡單的子問題的方式求解複雜問題的方法。動態規劃常常適用於有重疊子問題 1 和最優子結構性質的問題,動態規劃方法所耗時間往往遠少於...

動態規劃經典問題

子串 在給定的字串中選取連續的一段 子串行 可以不連續,但是要保證出現的順序與原字串相同 比如字串abcdefg abc既是子串又是子串行 acd只是子串行 一 最大連續子串行和 給定乙個整數序列a1,a2 an。求最大的連續的子串行的和。比如的最大連續子串行的和為5 3 1 1 2 萬能列舉?每次...

動態規劃 經典問題

今天記錄下自己所學的動態規劃知識點 有三枚硬幣 2,5,7 拼成27元 最少需要幾枚硬幣 我自己理解的動態規劃實操兩部曲 第一曲 定義初始條件 第二曲 迴圈操作 以及狀態方程定義 我的第乙個動態規劃程式 題目資訊 有三枚硬幣 2,5,7 拼成27元 最少需要幾枚硬幣 看到最少 一般用動態規劃求解 1...