設有n堆石子排成一排,其編號為1,2,3,…,n。
每堆石子有一定的質量,可以用乙個整數來描述,現在要將這n堆石子合併成為一堆。
每次只能合併相鄰的兩堆,合併的代價為這兩堆石子的質量之和,合併後與這兩堆石子相鄰的石子將和新堆相鄰,合併時由於選擇的順序不同,合併的總代價也不相同。
問題是:找出一種合理的方法,使總的代價最小,輸出最小代價。
f [i
][j]
f[i][j]
f[i][j
]所有將第i
ii堆石子到第j
jj堆石子合併成一堆石子的合併方式
f [l
][r]
=min
(f[l
][r]
,f[l
][k]
+f[k
+1][
r]+s
[r]−
s[l−
1]
)f[l][r] = min(f[l][r],f[l][k] + f[k + 1][r]+s[r] - s[l - 1])
f[l][r
]=mi
n(f[
l][r
],f[
l][k
]+f[
k+1]
[r]+
s[r]
−s[l
−1])
合併以k
kk為分界的左右區間費用的最小值加上合併當前區間的費用
const
int n =
305;
int s[n]
;int f[n]
[n];
intmain()
}}cout << f[1]
[n];
return0;
}
線性dp 區間dp
1 尼克的任務 額一道挺水的題,愣是做了幾個小時 動態規劃大致的思路還是找乙個轉移 換個詞就是影響 我們可以明顯看出本題的規則 空暇時,一遇到任務必須挑乙個接 求1 n時間內最大空暇時間 所以將任務排序是必要的,兩個關鍵字 再來想象一下當我做到第i 個任務時,我在 st i st i t i 1 時...
線狀DP及區間DP
這裡我們都用到動態規劃的思想 dynamic programming,簡稱dp。本質就是組合子問題來求解原問題,且對每個子問題只求解一次。一般來說四個步驟 1.刻畫乙個最優結構特徵 2.遞迴的定義最優解值 3.計算最優解的值 4.利用計算出的資訊構造乙個最優解 這邊直接給出 include incl...
區間dp小結
區間dp,顧名思義,就是在區間上dp,即把整個區間劃分為乙個個的小區間,在小區間內dp求出最優值,然後把這些小區間合併以後就是整個取件的最優值。下面是一些比較經典的區間dp題目 1.nyoj 737 石子合併 題意 有n堆石子,每堆有a i 個,每次合併時只能合併相鄰的兩堆,代價為兩堆石子的個數之和...