演算法筆記 區間dp

2022-03-05 04:42:43 字數 816 閱讀 6323

1.石子歸併問題

dp[i][j]表示區間i到j合併所需的最小花費。

先求出小區間的最小花費,再轉移到大的區間。

轉移方程:dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j])

初始狀態:dp[i][i]=0

模板:

for(int i=1;i<=n;i++)cin>>a[i],sum[i]=sum[i-1]+a[i]

for(int l=2;l<=n;l++)

}

2.括號匹配問題

求最大括號匹配數

dp[i][j]表示i到j區間的最大括號匹配數

先求出小區間的最大括號匹配數,再轉移到大區間。

狀態轉移:

dp[i][j]=dp[i+1][j-1]+2(s[i]=='('&&s[j]==')'||s[i]=='['&&s[j]==']')

dp[i][j]=max(dp[i][k]+dp[k+1][j],dp[i][j])(i<=k初始狀態:dp[i][j]=0

模板:

for(int len=2;len<=s.size();len++)

}}

記錄路徑,括號補全

用pos[i][j]記錄i到j這段區間從哪個位置斷開所要消耗的括號最少,然後從斷點分開,遞迴輸出答案。

模板:

void dfs(int l,int

r)

else

else

}}for(int l=2;l<=len;l++)}}

}dfs(

0,len-1);

參考部落格:

區間dp筆記

區間dp是一類在區間上進行dp的最優問題,一般是根據問題設出乙個表示狀態的dp,可以是二維的也可以是三維的,一般情況下為二維。然後將問題劃分成兩個子問題,也就是一段區間分成左右兩個區間,然後將左右兩個區間合併到整個區間,或者說區域性最優解合併為全域性最優解,然後得解。區間dp就是f i j 表示i到...

區間dp學習筆記

定義 區間動態規劃問題一般都是考慮,對於每段區間,他們的最優值都是由幾段更小區間的最優值得到,是分治思想的一種應用,將乙個區間問題不斷劃分為更小的區間直至乙個元素組成的區間,列舉他們的組合 求合併後的最優值。設f i,j 1 i j n 表示區間 i,j 內的數字相加的最小代價最小區間f i,i 0...

區間dp學習筆記

怎麼辦,膜你賽要掛慘了,下午我還在學區間 dp 不管怎麼樣,計畫不能打亂 4 不 4 為啥我一開始就先弄模板呢?因為這東西看模板就能看懂。for int i 2 i len i 列舉區間長度 for int l 1,r l len 1 r n l r 列舉左端點和右端點 以下你可以搞一下事情 for...