經典 區間dp 合併石子

2021-08-11 05:16:41 字數 878 閱讀 8598

題目鏈結 :

這個動態規劃的思是,要得出合併n堆石子的最優答案可以從小到大列舉所有石子合併的最優情況,例如要合併5堆石子就可以從,最優的2+3和1+4中得到最佳的答案。從兩堆最優到三堆最優一直到n堆最優。

狀態轉移方程式:dp [ i ] [ j ] = min(dp [ i ] [ k ] + dp [ k+1 ] [ j ])

複雜度為o(n^3)

#include

using

namespace

std;

const

int maxn = 210;

int dp[maxn][maxn],sum[maxn];

int main()

for(int l=2;l<=n;l++)//從i開始長度為l合併的最優答案

for(int i=1;i<=n-l+1;i++)

printf("%d\n",dp[1][n]);

}return

0;}

經過平行四邊形優化之後複雜度為o(n^2)

平行四邊形優化

/*由平行四邊形原理可得,s[i-1][j]<=s[i][j]<=s[i+1][j]*/

#include

using

namespace

std;

const

int maxn = 210;

int dp[maxn][maxn],sum[maxn],s[maxn][maxn];

void init(int n)

}int main()}}

printf("%d\n",dp[1][n]);

}return

0;}

區間DP經典 石子合併

題目鏈結 題意 環形的一群石子,每次可以選擇相鄰的兩堆合併,分數為新得到的一堆石子,求將這片石子合併成一堆的最大和最小分數 輸入 第一行乙個正整數n,其後n個數代表每堆石子的個數 分析 第一次寫的時候我想當然的寫的狀態轉移方程是dpx l r max dpx l 1 r a l r dpx l r ...

石子合併 (區間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...