有的問題具有最優子結構,可以使用動態規劃求解。但是在求解該最優子結構時,需要使用另外乙個問題的最優子結構。這個時候我們就必須使用雙重動態規劃進行求解。
給定乙個整數陣列,求最大子陣列的乘積。
題目很明顯需要使用動態規劃。但是我們在仔細考慮最優子結構時考慮到,兩個很小的負數相乘也可以得到最大乘積,所以必須使用「最小子陣列的乘積」這個問題的最優子結構。兩個最優子結構互相巢狀,同事更新,謂之雙重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行,每行兩個整數...