區間DP總結

2022-01-25 14:09:58 字數 1666 閱讀 5309

做了幾題區間動態規劃的題目,覺得區間動態規劃的題目是有點難的。區間dp大概是這一類的動態規劃,在乙個線性的資料上對區間進行狀態轉移,dp[i][j]表示i到j的區間。dp[i][j]可以由子區間的狀態轉移而來,關鍵是dp[i][j]表示的是什麼,然後去找dp[i][j]和子區間的關係。要知道,在求dp[i][j]之前,i到j之間的子區間都已經求出來最優解。

一點一點說吧!

首先我覺得首先區間dp的應用要先想到回文串的,包括乙個字串的最長的非連續的回文串,乙個字串非連續的回文串的數目。因為回文串的特點對應的兩端字元是相等的,所以狀態是可以轉移的,先看一道求乙個字串中回文串的數目:

hdu 4632

題解:

接下來就是求回文串的最長的長度問題

hdu 4745

這道題目是在求區間最長的回文串長度公升級一下,序列是一條鏈。這裡可以用倍增的方法。狀態轉移方程:

dp[i][j]= max ( dp[i+1][j], max ( dp[i][j-1],

( a[i]==a[j] ? dp[i+1][j-1] + 2 : dp[i+1][j-1] ) ) );就是在dp[i+1][j],dp[i][j-1],dp[i+1][j-1]三個子區間求最大值。

題解:

這道題和前面的比較,求最長的長度是在dp[i+1][j],dp[i][j-1],dp[i+1][j-1]三個子區間裡進行比較,而求數量,則是把求子區間的和。這兩道的題目的子區間只涉及到dp[i+1][j],dp[i][j-1],dp[i+1][j-1],並沒有在i到j之間進行區間劃分,這是因為回文串的特性。

下面看劃分區間的區間dp問題:

題目鏈結

這是一道簡單的區間劃分dp題目

求最長的匹配括號的長度,劃分區間是沒有條件的,從i到j區間內任何一點都可以劃分,dp[i][j]=max(dp[i][k]+dp[k+1][j])

題解:

題目鏈結

題解:

題目鏈結

狀態轉移方程是要在i到j區間之間進行區間劃分。你可以從左端點開始,也可以從右端點開始。只有當k等於左端點或者右端點的時候才可以劃分。因為這樣的話,第k天就不用穿新衣服,少買了一件,這也是得到最優解的關鍵,

題解:

再看這道題目的公升級版

在前面的基礎上,再進行一次區間dp

題解:

再看一道難度增加的區間劃分

題目:

這道題目在劃分區間之後,要計算因為狀態改變,而改變的不滿意值

題解:

有時候區間dp的狀態要根據題目有不同的形式,不僅是二維陣列表示區間,也可以加其他維,表示不同的狀態。

題目鏈結

這道題目用來四維陣列,另外兩維表示左邊和右邊的顏色種類

題解:

題目鏈結

三維陣列,第三維表示快遞小哥在區間的哪一邊?

題解:

最優三角劃分:

這個題目要先用凸包演算法判斷凸包,然後再進行區間劃分,進行dp

題解:

區間dp總結

持續更新 1.p1005 矩陣取數 解題思路 按行區間dpvoid print int128 x 部分 include include include using namespace std int128 map 85 85 f 85 85 int128 ans 0 按行區間dp int128 p ...

區間DP總結(一)

noip2000提高 乘積最大 需要用到高精度,目前還不會。noip2006提高組 能量項鍊 noi1995 石子合併 經典區間dp poj1141 brackets sequence 括號匹配 值得細看的部落格 動態規劃之區間dp專題 1 石子合併題目 區間dp模板。include define ...

區間DP總結(二)

poj 1141 brackets sequence 括號匹配並輸出方案 洛谷2858 奶牛零食 區間長度逐漸縮小 洛谷1622 釋放囚犯 將問題向區間dp轉化的思想 參考部落格 劍鋒oi部落格動態規劃之區間dp專題 區間dp常用模板 初始化dp陣列及len為1的情況 for int len 2 l...