題目鏈結
題解: 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...