雙重DP例項1 回文分割

2021-07-04 02:51:35 字數 1072 閱讀 6927

有的問題具有最優子結構,可以使用動態規劃求解。但是在求解該最優子結構時,需要使用另外乙個問題的最優子結構。這個時候我們就必須使用雙重動態規劃進行求解。

給定乙個整數陣列,求最大子陣列的乘積。

題目很明顯需要使用動態規劃。但是我們在仔細考慮最優子結構時考慮到,兩個很小的負數相乘也可以得到最大乘積,所以必須使用「最小子陣列的乘積」這個問題的最優子結構。兩個最優子結構互相巢狀,同事更新,謂之雙重dp。

int maxproduct(vector

& nums)

return *max_element(mymax.begin(), mymax.end());

}

時間複雜度和空間複雜度都為o(

n)。將乙個字串分割成若干個回文子串,求最少的切割次數。

我們使用一維表dp記錄從i開始到末尾(第len個位置)回文子串的最小個數(i從0開始)。則狀態方程: dp

[i]=

maxj

(1+d

p[j+

1])

其中j∈[

i,le

n−1]

並且[i,

j]必須是回文子串。

欲求解dp[

i],我們必須保證[i

,j] 是回文子串,而判斷當前子串是否是回文,可以使用動態規劃求解。is

pal[

i][j

] 記錄i到j之間的子串是否是回文。

i<

j 時, is

pal[

i][j

]=(s

.at(

i)==s

.at(

j))?

ispa

l[i+

1][j

−1]:

0 i==

j 時, is

pal[

i][j

]=1 。

int mincut(string s) }}

return dp.at(0)-1;

}

該問題時間複雜度和空間複雜度都是o(

n2)

1 回文劃分

time limit 1000ms memory limit 1000k 題型 程式設計題 語言 無限制 我們說乙個字串是回文串,那麼意味著這個串從兩邊讀起來的字母都是一樣的。例如racecar是回文串,然而fastcar則不是。對乙個串的劃分意思是將乙個串劃分為若干個部分。例如,racecar可以...

1154 回文串劃分(dp)

1154 回文串劃分 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 有乙個字串s,求s最少可以被劃分為多少個回文串。例如 abbaabaa,有多種劃分方式。a bb aabaa 3 個回文串 a bb a aba a 5 個回文串 a b b a a b a a...

1087 回文串詢問 經典dp

pipi要考考你對回文串的掌握了 現在有乙個長度為n的字串s,pipi對此有q個詢問,每次詢問s中某個連續區間 從1開始 是否構成回文串,若是輸出 yes 否則輸出 no 多組資料。第一行為兩個個整數n,q 1 n 1000,1 q 100000 第二行為乙個長為n的字串s。接下來q行,每行兩個整數...