計蒜客 合併石子 區間dp

2021-09-10 06:42:25 字數 860 閱讀 2941

題目鏈結 

題解: leetcode裡面有個戳氣球的題和這個類似,用區間dp來解。

由於n堆(n>=2)石子合併,最終一定會有個只剩2堆石子的中間狀態,這個狀態就是突破口。

最終的2堆石子一定是在原來的石子裡面連續的,可以用dp[i][j]表示區間i..j的石子合併後最小的體力消耗,

n堆石子消耗的最小體力為dp[1][n],先將石子合併來只剩2堆,只需要列舉2堆石子的邊界即可,最後再將2堆石子合併為1堆。所以狀態轉移方程為dp[i][j] = min(dp[i][k]+dp[k+1][j]+sum[i][j]) (i<=k#include #include #define maxn 0x3fffff

using namespace std;

int n;

int a[100];

int dp[100][100];

int count[100];// 統計區間和

int main()

// printf("\n");

// 區間dp

// 列舉區間長度

for(int len = 2;len <= n;len++)

// 區間起點

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

dp[i][i+len-1] = t;

// printf("dp[%d][%d]=%d\n",i,i+len-1,t);

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

return 0;

}

合併石子 (區間覆蓋DP)

任重而道遠 在乙個操場上一排地擺放著 堆石子。現要將石子有次序地合併成一堆。規定每次只能選相鄰的 堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的得分。計算出將 堆石子合併成一堆的最小得分。第一行為乙個正整數n 2 100 以下 行,每行乙個正整數,小於10000,分別表示第i堆石子的個數 1...

合併石子(區間dp 模板題)

設有n堆沙子排成一排,其編號為1,2,3,n n 300 每堆沙子有一定的數量,可以用乙個整數來描述,現在要將這n堆沙子合併成為一堆,每次只能合併相鄰的兩堆,合併的代價為這兩堆沙子的數量之和,合併後與這兩堆沙子相鄰的沙子將和新堆相鄰,合併時由於選擇的順序不同,合併的總代價也不相同,如有4堆沙子分別為...

合併石子 區間dp水題

合併石子 描述 有n堆石子排成一排,每堆石子有一定的數量。現要將n堆石子並成為一堆。合併的過程只能每次將相鄰的兩堆石子堆成一堆,每次合併花費的代價為這兩堆石子的和,經過n 1次合併後成為一堆。求出總的代價最小值。tags 最基本的區間dp,這題範圍小,如果n大一些,還是要加個平行四邊行優化。incl...