區間dp原理

2021-10-17 11:25:07 字數 918 閱讀 6547

設有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 個,每次合併時只能合併相鄰的兩堆,代價為兩堆石子的個數之和...