合併石子(求最小代價)

2021-08-09 14:57:28 字數 691 閱讀 9826

題目描述:

設有n堆沙子排成一排,其編號為1,2,3,…,n(n<=100)。每堆沙子有一定的數量。現要將n堆沙子並成為一堆。歸併的過程只能每次將相鄰的兩堆沙子堆成一堆,這樣經過n-1次歸併後成為一堆。總的代價最小為多少。 分析

令f[i,j]表示歸併第i個數到第j數的最小代價,sum[i,j]表示第i個數到第j個數的和,這個可以事先計算出來。sum[i,j]可以在o(1)的時間內算出.

容易的到以下的動態轉移方程:

f[i,j]=min(f[i,k]+f[k+1,j]+sum[i,j])

階段:以歸併石子的長度為階段,一共有n-1個階段。

狀態:每個階段有多少堆石子要歸併,當歸並長度為2時,有n-1個狀態;

當歸並長度為3時,有n-2個狀態;

當歸並長度為n時,有1個狀態。

決策:當歸並長度為2時,有1個決策;當歸並長度為3時,有2個決策;

當歸並長度為n時,有n-1個決策。

#include #includeint dp[110][110];//記錄狀態

int a[110];//石子重量

int s[110];//s[i]代表石子1到j的重量總和

int n;

int dp(int i,int j)//代表石子i到j的最小耗費

int ans=9999999;

int k;

for(k=i;k

最小代價樹

題目 描述以下方法稱為最小代價的字母樹 給定一正整數序列,例如 4,1,2,3,在不改變量的位置的條件下把它們相加,並且用括號來標記每一次加法所得到的和。例如 4 1 2 3 5 5 10。除去原數不4,1,2,3之外,其餘都為中間結果,如5,5,10,將中間結果相加,得到 5 5 10 20,那麼...

最小編輯代價

對於兩個字串a和b,我們需要進行插入 刪除和修改操作將a串變為b串,定義c0,c1,c2分別為三種操作的代價,請設計乙個高效演算法,求出將a串變為b串所需要的最少代價。給定兩個字串a和b,及它們的長度和三種操作代價,請返回將a串變為b串所需要的最小代價。保證兩串長度均小於等於300,且三種代價值均小...

最小編輯代價

給定兩個字串str1和str2,再給定三個整數ic,dc和rc,分別代表插入 刪除和替換乙個字元的代價,請輸出將str1編輯成str2的最小代價。輸出三行,第一行和第二行均為一行字串,分別表示兩個字串str1,str2。left 1 leq length str1 length str2 leq 5...