dp[0] = nums[0] res = nums[0] for each inrange(1,len(nums)): dp[each] = max(dp[each-1]+nums[each], nums[each]) res = max(res, dp[each]) #print dp return res
从上一段分析可以看出,dp状态只与上一个状态有关,从而可以简化成变量来储存dp[]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
classSolution(object): defmaxSubArray(self, nums): """ :type nums: List[int] :rtype: int """ ifnot nums: return0 iflen(nums) == 1: return nums[0] prevMax = nums[0] res = nums[0] for each inrange(1,len(nums)): prevMax = max(prevMax+nums[each], nums[each]) res = max(res, prevMax) #print dp return res
300. Longest Increasing Subsequence
找出Max 这道题有点不一样的地方是最后的结果有可能是任意一个位置,所以不是简单的return dp[-1]而是max(dp) dp[i] = 1 + max(dp[j]) j < i and A[i] > A[j]
1 2 3 4 5 6 7 8 9 10 11 12 13 14
classSolution(object): deflengthOfLIS(self, nums): """ :type nums: List[int] :rtype: int """ ifnot nums: return0 dp = [1] * (len(nums) + 1) for i inrange(len(nums)): for j inrange(i): if nums[j] < nums[i]: dp[i] = max(dp[i], dp[j]+1) returnmax(dp)
139.Word Break
寻求解的存在性 和上一题有点像,dp[i] 为当前字符满足之前的字符在字典里
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
classSolution(object): defwordBreak(self, s, wordDict): """ :type s: str :type wordDict: List[str] :rtype: bool """ ifnot s: returnFalse # dp保存dp【i】i之前的最少字符串 dp = [False] * (len(s) + 1) dp[0] = True # 本身的循环,对字符串,在内层循环中需要使用i for i inrange(1, len(s)+1): for j inrange(i): if dp[j] and s[j:i] in wordDict: dp[i] = True# 因为j~i是一个回文字符串 return dp[-1]
classSolution(object): deffindNumberOfLIS(self, nums): """ :type nums: List[int] :rtype: int """ ifnot nums: return0 dp = [1for _ inrange(len(nums))] dc = [1for _ inrange(len(nums))] for i inrange(len(nums)): for j inrange(i):
if nums[i] > nums[j]: if dp[i] < dp[j] + 1: dp[i] = dp[j] + 1 dc[i] = dc[j] elif dp[i] == dp[j] + 1: dc[i] += dc[j] # we have multiple same length LIS, we need to add them res = 0
for index, value inenumerate(dp): if value == max(dp): res += dc[index] return res
309. Best Time to Buy and Sell Stock with Cooldown
classSolution(object): defuniquePaths(self, m, n): """ :type m: int :type n: int :rtype: int """ ifnot m ornot n: return0 dp = [[1for _ inrange(n)] for _ inrange(m)] for i inrange(1,m): for j inrange(1,n): dp[i][j] = dp[i-1][j] + dp[i][j-1] return dp[-1][-1]
classSolution(object): defuniquePaths(self, m, n): """ :type m: int :type n: int :rtype: int """ dp = [1for _ inrange(m)] for i inrange(1,n): for j inrange(1,m): dp[j] += dp[j-1] return dp[-1]
classSolution(object): defmaxA(self, N): """ :type N: int :rtype: int """ if N <= 6: return N dp = [i for i inrange(N+1)] for i inrange(7,N+1): for j inrange(1,i-2): dp[i] = max(dp[i], dp[j] * (i-j-1)) return dp[-1]
classSolution(object): defmaximalSquare(self, matrix): """ :type matrix: List[List[str]] :rtype: int """ ifnot matrix: return0 res = 0 m = len(matrix) n = len(matrix[0]) dp = [[0for _ inrange(n+1)] for _ inrange(m+1)] for i inrange(1,m+1): for j inrange(1, n+1): if matrix[i-1][j-1] == '1':
for i inrange(l1): dp[i][0] = i for j inrange(l2): dp[0][j] = j for i inrange(1,l1): for j inrange(1,l2): if word1[i-1] == word2[j-1]: dp[i][j] = dp[i-1][j-1] else: dp[i][j] = min(dp[i][j-1],dp[i-1][j], dp[i-1][j-1]) + 1 #print dp return dp[-1][-1]