有n堆石子排成一排,每堆石子有一定的數量。現要將n堆石子並成為一堆。合併的過程只能每次將相鄰的兩堆石子堆成一堆,每次合併花費的代價為這兩堆石子的和,經過n-1次合併後成為一堆。求出總的代價最小值。
假設dp[1][4]表示將區間1~4的石子合併所花費的代價。dp[1][4]可以劃分為dp[1][1]+dp[2][4]、dp[1][2]+dp[3][4]、dp[1][3]+dp[4][4]。還可以往下繼續劃分。這是劃分的區間層次圖:
我們只需要用dp從下往上推就行了。我們可以用乙個sum陣列來儲存一段區間內的合併代價。用k來表示分割點,嘗試區間內所有可能的分割,取代價最小的那個。
轉移方程:dp[begin][end]=dp[begin][k]+dp[k+1][end]+sum[end]-sum[begin-1];
**:
#include#include#includeusing namespace std;
#define inf 1<<30
int dp[210][210],sum[210],a[210];
int main()
for(int i=1; idp[begin][k]+dp[k+1][end]+sum[end]-sum[begin-1])
dp[begin][end]=dp[begin][k]+dp[k+1][end]+sum[end]-sum[begin-1];}}
}printf("%d\n",dp[1][n]);
}return 0;
}
石子合併 (區間DP
問題描述 在乙個操場上擺放著一行共n堆的石子。現要將石子有序地合併成一堆。規定每次只能選相鄰的兩堆合併成新的一堆,並將新的一堆石子數記為該次合併的得分。請編輯計算出將n堆石子合併成一堆的最小得分和將n堆石子合併成一堆的最大得分。輸入檔案 輸入第一行為n n 1000 表示有n堆石子,第二行為n個用空...
石子合併 (區間DP)
題目鏈結 描述 有n堆石子排成一排,每堆石子有一定的數量。現要將n堆石子並成為一堆。合併的過程只能每次將相鄰的兩堆石子堆成一堆,每次合併花費的代價為這兩堆石子的和,經過n 1次合併後成為一堆。求出總的代價最小值。輸入第一行有乙個整數n,表示有n堆石子。接下來的一行有n 0 n 200 個數,分別表示...
區間DP 石子合併
區間dp的經典例題,有三種題型 本篇部落格借鑑了了兩位大佬的部落格。部落格1 部落格2 問題 n堆石子,現要將石子有序的合併成一堆。每次只能移動任意的2堆石子合併,合併花費為新合成的一堆石子的數量。求將這n堆石子合併成一堆的總花費最小 或最大 思路 貪心,每次把最小的兩堆合併即可,可以使用stl中的...