區間DP 總結 石子合併

2021-07-30 19:35:49 字數 1546 閱讀 8850

這位博主寫的很詳細

例題:石子歸併。

描述 有n堆石子排成一排,每堆石子有一定的數量。現要將n堆石子並成為一堆。合併的過程只能每次將相鄰的兩堆石子堆成一堆,並將新的一堆石子數記為該次合併的得分。

給組測試資料 

輸入   4    表示有4堆石子

4 4 5 9  表示每堆石子的個數

輸出  54         表示最大的得分   

分析:主要思想就是乙個乙個累加:4 4 5 9 先看下去是我想知道dp[i][j]的最大值,i表示起始位置,j表示終止位置,所以我肯定是想求出dp[1][4]間的最大值

dp[1][1]=4;dp[2][2]=4;dp[3][3]=5;dp[4][4]=9。然後我在長度為2的時候記錄,dp[1][2]=4+4=8,dp[2][3]=8+5=14;dp[3][4]=14+9=23;這樣加起來的值就是8+14+23=45;但是如果我反過來呢?dp[1][2]=5+9=14;dp[2][3]=14+4=18;dp[3][4]=18+4=22;這樣加起來的值就是14+18+22=54。很明顯,54就是所求的最大值。

如圖,如果我相求圈著的這個三個的值,我完全可以有圖上這兩種分割,並且分割出來的值是已經知道的了。

動態規劃的思想:先兩兩合併,在三三合併,最後再nn合併,在合併過程中,較大的區間可以拆分成已經的小區間進行計算,省時又省力。比如,我可以在三三合併的時候可以拆分成一一還有二三相加。即把當前階段的合併方法細分成前一階段已計算出的方法,選擇其中的最優方案。

具體來說我們應該定義乙個陣列dp[i,j]用來表示合併方法,i表示從編號為i的石頭開始合併,j表示所求區間的結尾,sum表示的是石頭的數量。

對於上面的例子來說,

第一階段:dp[1][1],dp[2][2],dp[3][3],dp[4][4] 因為一開始還沒有合併,所以這些值應該全部為0。

第二階段:兩兩合併過程如下,其中sum(i,j)表示石頭的數量,即從i開始數j個數的和

dp[1,2]=dp[1,1]+dp[2,2]+sum[1,2];

dp[2,3]=dp[2,2]+dp[3,3]+sum[2,3];

dp[3,4]=dp[3,3]+dp[4,4]+sum[4,4];

第三階段:三三合併可以拆成兩兩合併,拆分方法有兩種,前兩個為一組或後兩個為一組

dp[1,3]=dp[1,2]+dp[3,3]+sum[1,3]或dp[1,3]=dp[1,1]+dp[2,3]+sum[1,3];取其最優

dp[2,4]=dp[2,2]+dp[3,4]+sun[2,4]或dp[2,4]=dp[2,3]+dp[3,3]+sum[2,4];取其最優

第四階段:四四合併的拆分方法用三種,同理求出三種分法的得分,取其最優即可。以後第五階段、第六階段依次類推,最後在第六階段中找出最優答案即可。

動態方程為dp[i][j]=dp[i][k]+dp[k+1][j]+sum[i][j];

石子合併 (區間DP

問題描述 在乙個操場上擺放著一行共n堆的石子。現要將石子有序地合併成一堆。規定每次只能選相鄰的兩堆合併成新的一堆,並將新的一堆石子數記為該次合併的得分。請編輯計算出將n堆石子合併成一堆的最小得分和將n堆石子合併成一堆的最大得分。輸入檔案 輸入第一行為n n 1000 表示有n堆石子,第二行為n個用空...

石子合併 區間dp

有n堆石子排成一排,每堆石子有一定的數量。現要將n堆石子並成為一堆。合併的過程只能每次將相鄰的兩堆石子堆成一堆,每次合併花費的代價為這兩堆石子的和,經過n 1次合併後成為一堆。求出總的代價最小值。假設dp 1 4 表示將區間1 4的石子合併所花費的代價。dp 1 4 可以劃分為dp 1 1 dp 2...

石子合併 (區間DP)

題目鏈結 描述 有n堆石子排成一排,每堆石子有一定的數量。現要將n堆石子並成為一堆。合併的過程只能每次將相鄰的兩堆石子堆成一堆,每次合併花費的代價為這兩堆石子的和,經過n 1次合併後成為一堆。求出總的代價最小值。輸入第一行有乙個整數n,表示有n堆石子。接下來的一行有n 0 n 200 個數,分別表示...