石子合併 區間dp

2021-08-04 20:38:29 字數 837 閱讀 2775

有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中的...