07-05:動(dòng)態(tài)規(guī)劃review2

動(dòng)態(tài)規(guī)劃常見問題

零、組合問題

1、硬幣問題

n=len(arr)

? ? ? ? if n<=0 or aim<=0:

? ? ? ? ? ? return 0

? ? ? ? dp=[float("inf")]*(aim+1)

? ? ? ? dp[0]=0

? ? ? ? for i in range(n):

? ? ? ? ? ? for j in range(arr[i],aim+1):

? ? ? ? ? ? ? ? dp[j]=min(dp[j],dp[j-arr[i]]+1)

? ? ? ? return dp[aim] if dp[aim]!=float("inf") else -1

https://www.nowcoder.com/practice/3911a20b3f8743058214ceaa099eeb45?tpId=117&&tqId=37795&rp=1&ru=/activity/oj&qru=/ta/job-code-high/question-ranking

一、子序列、字串問題

1、最長連續(xù)字串

res = ""

? ? ? ? maxlen = 0

? ? ? ? for i in range(len(str1)):

? ? ? ? ? ? if str1[i-maxlen : i+1] in str2:

? ? ? ? ? ? ? ? res = str1[i-maxlen:i+1]

? ? ? ? ? ? ? ? maxlen = maxlen + 1

? ? ? ? return res

https://www.nowcoder.com/practice/f33f5adc55f444baa0e0ca87ad8a6aac?tpId=117&&tqId=37799&rp=1&ru=/activity/oj&qru=/ta/job-code-high/question-ranking

2、最長子序列(不要求連續(xù))長度

m, n = len(text1), len(text2)

? ? ? ? dp = [[0] * (n + 1) for _ in range(m + 1)]


? ? ? ? for i in range(1, m + 1):

? ? ? ? ? ? for j in range(1, n + 1):

? ? ? ? ? ? ? ? if text1[i - 1] == text2[j - 1]:

? ? ? ? ? ? ? ? ? ? dp[i][j] = dp[i - 1][j - 1] + 1

? ? ? ? ? ? ? ? else:

? ? ? ? ? ? ? ? ? ? dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])


? ? ? ? return dp[m][n]

https://leetcode-cn.com/problems/longest-common-subsequence/

3、最長子序列(不要求連續(xù))

m=len(s1)

? ? ? ? n=len(s2)

? ? ? ? dp=[["" for j in range(n+1)] for i in range(m+1)]

? ? ? ? for i in range(m):

? ? ? ? ? ? for j in range(n):

? ? ? ? ? ? ? ? if s1[i]==s2[j]:

? ? ? ? ? ? ? ? ? ? dp[i+1][j+1]=dp[i][j]+s1[i]

? ? ? ? ? ? ? ? else:

? ? ? ? ? ? ? ? ? ? if len(dp[i][j+1])>len(dp[i+1][j]):

? ? ? ? ? ? ? ? ? ? ? ? dp[i+1][j+1]= dp[i][j+1]?

? ? ? ? ? ? ? ? ? ? else:

? ? ? ? ? ? ? ? ? ? ? ? dp[i+1][j+1]= dp[i+1][j]

? ? ? ? return? dp[m][n] if dp[m][n]!="" else "-1"

https://www.nowcoder.com/practice/6d29638c85bb4ffd80c020fe244baf11?tpId=117&&tqId=37798&rp=1&ru=/activity/oj&qru=/ta/job-code-high/question-ranking

二、股票交易問題

二次交易

if len(prices)<=1:

? ? ? ? ? ? return 0

? ? ? ? k=len(prices)

? ? ? ? #定義最大收益

? ? ? ? dp0=[0]*k

? ? ? ? dp1=[0]*k

? ? ? ? dp2=[0]*k

? ? ? ? dp3=[0]*k

? ? ? ? dp4=[0]*k


? ? ? ? dp0[0]=0

? ? ? ? dp1[0]=-prices[0]

? ? ? ? dp2[0]=0

? ? ? ? dp3[0]=-prices[0]

? ? ? ? dp4[0]=0


? ? ? ? for i in range(1,k):

? ? ? ? ? ? dp0[i]=dp0[i-1]

? ? ? ? ? ? dp1[i]=max(dp1[i-1],dp0[i-1]-prices[i])

? ? ? ? ? ? dp2[i]=max(dp2[i-1],dp1[i-1]+prices[i])

? ? ? ? ? ? dp3[i]=max(dp3[i-1],dp2[i-1]-prices[i])

? ? ? ? ? ? dp4[i]=max(dp4[i-1],dp3[i-1]+prices[i])


? ? ? ? return dp4[k-1]

https://www.nowcoder.com/practice/4892d3ff304a4880b7a89ba01f48daf9?tpId=117&&tqId=37847&rp=1&ru=/activity/oj&qru=/ta/job-code-high/question-ranking

三、子數(shù)組最大乘積

核心的關(guān)鍵是:判斷當(dāng)前值的正負(fù)以及需要兩個(gè)狀態(tài)

k=len(arr)

? ? ? ? dpmax=[0]*k

? ? ? ? dpmin=[0]*k

? ? ? ? if k==0:

? ? ? ? ? ? return

? ? ? ? if k==1:

? ? ? ? ? ? return arr[0]

? ? ? ? dpmax[0]=arr[0]

? ? ? ? dpmin[0]=arr[0]

? ? ? ? maxsum=arr[0]

? ? ? ? for i in range(1,k):

? ? ? ? ? ? if arr[i]>0:

? ? ? ? ? ? ? ? dpmax[i]=max(arr[i],arr[i]*dpmax[i-1])

? ? ? ? ? ? ? ? dpmin[i]=min(arr[i],arr[i]*dpmin[i-1])

? ? ? ? ? ? else:

? ? ? ? ? ? ? ? dpmax[i]=max(arr[i],arr[i]*dpmin[i-1])

? ? ? ? ? ? ? ? dpmin[i]=min(arr[i],arr[i]*dpmax[i-1])


? ? ? ? ? ? maxsum=max(maxsum,dpmax[i])

? ? ? ? return maxsum

https://www.nowcoder.com/practice/9c158345c867466293fc413cff570356?tpId=117&&tqId=37785&rp=1&ru=/activity/oj&qru=/ta/job-code-high/question-ranking

四、字符串的全排

res=[]

? ? ? ? c=list(ss)

? ? ? ? k=len(c)

? ? ? ? if k==1:

? ? ? ? ? ? return c

? ? ? ? else:

? ? ? ? ? ? for i in range(k):

? ? ? ? ? ? ? ? first=str(c[i])

? ? ? ? ? ? ? ? for tmp in self.Permutation(''.join(c[:i]+c[i+1:])):

? ? ? ? ? ? ? ? ? ? second=''.join(tmp)

? ? ? ? ? ? ? ? ? ? s=first+second

? ? ? ? ? ? ? ? ? ? if s not in res:

? ? ? ? ? ? ? ? ? ? ? ? res.append(s)

? ? ? ? return res

https://www.nowcoder.com/practice/fe6b651b66ae47d7acce78ffdd9a96c7?tpId=117&&tqId=37778&rp=1&ru=/activity/oj&qru=/ta/job-code-high/question-ranking

leetcode:567字符串的排列

https://leetcode-cn.com/problems/permutation-in-string/

雙指針

劍指offer38:字符串的排列

https://leetcode-cn.com/problems/zi-fu-chuan-de-pai-lie-lcof/

回溯法

https://leetcode-cn.com/problems/zi-fu-chuan-de-pai-lie-lcof/solution/mian-shi-ti-38-zi-fu-chuan-de-pai-lie-hui-su-fa-by/





https://leetcode-cn.com/problems/zi-fu-chuan-de-pai-lie-lcof/solution/mian-shi-ti-38-zi-fu-chuan-de-pai-lie-hui-su-fa-by/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容