題目描述:
設有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...