確定狀態:最優策略中最後一段回文串是s[j...n-1]
需要知道s前j個字元[0...j-1]最少可以劃分成幾個回文串
子問題:
設:s前i個字元[0...i-1]最少可以劃分成f[i]個回文串
f[i] = min
初始條件:
f[0] = 0,前0個即空串是0
計算順序:f[0]...f[n]
判斷回文串:
分為奇數長度回文串和偶數長度回文串。
對每個字元進行列舉,兩邊擴充套件,建立乙個二維陣列,huiwen[i][j]表示字串s[i...j]是否是回文串,1表示是,0表示不是
**及注釋如下:
import sys
def min_huiwen(s):
n = len(s)
if n == 0:
return 0
#建立乙個二維陣列huiwen[i][j]表示字串s[i...j]是否是回文串,初始為0,即都不是回文串
huiwen = [[0 for i in range(n)] for j in range(n)]
#賦值huiwen[j]
for t in range(n):
#對於奇數長度回文串,從t向兩頭拓展
i = t
j = t
while i>=0 and j=0 and jhuiwen[i][j] = 1
i -= 1
j += 1
#s前i個字元[0...i-1]最少可以劃分成f[i]個回文串
f = [sys.maxsize for i in range(n+1)]
f[0] = 0
for j in range(1,n+1):
#f[i] = min
for i in range(j):
if huiwen[i][j-1] == 1:
f[j] = min(f[i]+1,f[j])
#劃分次數是個數-1
return f[n]-1
s = ['a','a','b']
print(min_huiwen(s))
#結果:1
整數劃分(劃分dp)總結
寫了幾個題發現整數劃分是一類題,而不是一道題。具體題型 1 n相同元素放入m個相同的盤子 盤子允許為空 例題 放蘋果 poj 1664設dp i j 為 j 個元素放入i個盤子轉移方程 dp i j dp i 1 j 新新增乙個盤子,盤子為空 dp i j dp i j i i個盤子 各取出乙個 2...
劃分型DP 乘積最大
題目 題目描述 description 今年是國際數學聯盟確定的 2000 世界數學年 又恰逢我國著名數學家華羅庚先生誕辰90周年。在華羅庚先生的家鄉江蘇金壇,組織了一場別開生面的數學智力競賽的活動,你的乙個好朋友xz也有幸得以參加。活動中,主持人給所有參加活動的選手出了這樣一道題目 設有乙個長度為...
劃分型DP 數字遊戲
在cv上看到乙個題解思路清晰,特地搬來這裡存一下。題目描述 description 丁丁最近沉迷於乙個數字遊戲之中。這個遊戲看似簡單,但丁丁在研究了許多天之後卻發覺原來在簡單的規則下想要贏得這個遊戲並不那麼容易。遊戲是這樣的,在你面前有一圈整數 一共n個 你要按順序將其分為m個部分,各部分內的數字相...