leetcode 死磕動態規劃 入門2

2021-08-23 12:40:45 字數 1733 閱讀 1623

每天堅持刷題!!!

今天繼續死磕動態規劃,昨個發現簡單題目沒啥用,今天開始死磕難題

直接上題

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 的思想...