每天堅持刷題!!!
今天繼續死磕動態規劃,昨個發現簡單題目沒啥用,今天開始死磕難題
直接上題
leetcode 32 最長有效括號
題目描述:
給定乙個只包含 『(』 和 『)』 的字串,找出最長的包含有效括號的子串的長度。
題目分析:
1.講真這個用棧做是挺簡單的,但是既然是死磕動態規劃而且在leetcode上也有動態規劃的標籤,那就要拼死也要用動態規劃來做。
2. 重點還是找狀態轉移方程,那麼如何定義暫存的陣列就成了最大問題,剛開始覺得可以定義成到第i個字元時的最大有效子串長度,後來發現找不到合理的狀態轉移方程。
3. 所以把陣列d[i]定義為以第i個字元結尾的最大有效子串長度,並額外用乙個max_length來跟蹤整體最大有效子串長度即可。那麼來具體分析下狀態轉移的過程:a. 因為只有』(『和』)』兩種字元,而且又要連續的有效子串,因此如果第i個字元是』)』而且第i-1個字元是』(『就構成了乙個有效子串,再加上d[i-2]即可(如果存在的話); b. 如果第i個字元和第i-1個字元無法匹配的話,則檢查第i - d[i-1]-1個字元是否和第i個字元匹配,不匹配d[i]為零,匹配則為d[i - 1] + 2 + d[i - d[id - 1] - 2]
是不是有點繞,我們舉個栗子:
f = 『)(())』, max = 0
d[0] = 0, max = 0
d[1] = 0, max = 0 因為f[0]和f[1]不匹配
d[2] = 0, max = 0 因為f[1]和f[2]不匹配
d[3] = 2, max = 2 因為f[2]和f[3]匹配
d[4] = 4, max = 4 因為f[4]和f[3]不匹配,但是f[4]和f[4 - d[3] - 1] = f[1]匹配
def
longestvalidparentheses
(s):
""" :type s: str
:rtype: int
"""ifnot s or len(s) == 1:
return
0 max_length = 0
temp = [0
for _ in xrange(len(s))]
for id in xrange(1, len(s)):
if s[id - 1] == '('
and s[id] == ')':
if id - 2 >= 0:
temp[id] = temp[id - 2] + 2
else:
temp[id] = 2
else:
if id - temp[id - 1] - 1 >= 0:
if s[id - temp[id - 1] - 1] == '('
and s[id] == ')':
if id - temp[id - 1] - 2 >= 0:
temp[id] = temp[id - 1] + 2 + temp[id - temp[id - 1] - 2]
else:
temp[id] = temp[id - 1] + 2
else:
temp[id] = 0
else:
temp[id] = 0
if temp[id] > max_length:
max_length = temp[id]
return max_length
死磕動態規劃
乙個模型三個特徵 理論講解什麼樣的問題適合用動態規劃來解決呢?換句話說,動態規劃能解決的問題有什麼規律可循呢?實際上,動態規劃作為乙個非常成熟的演算法思想,很多人對此已經做了非常全面的總結。我把這部分理論總結為 乙個模型三個特徵 首先,我們來看,什麼是 乙個模型 它指的是動態規劃適合解決的問題的模型...
最低票價 死磕動態規劃系列
題目 在乙個火車旅行很受歡迎的國度,你提前一年計劃了一些火車旅行。在接下來的一年裡,你要旅行的日子將以乙個名為 days 的陣列給出。每一項是乙個從 1 到 365 的整數。火車票有三種不同的銷售方式 一張為期一天的通行證售價為 costs 0 美元 一張為期七天的通行證售價為 costs 1 美元...
動態規劃入門
1 用 dp 做的題大多數返回值是int boolean,求max min,不能打亂原來輸入順序。2 動態規劃有兩個重要定義,乙個叫 optimal substructure 另乙個叫 overlap subproblem 各種排序 tree 類問題中,都會用到 divide conquer 的思想...