力扣 动态规划 Python

1.除数博弈

class Solution(object):
    def divisorGame(self, N):
        """
        :type N: int
        :rtype: bool
        """
        if N % 2 != 0:
            return False
        else:
            return True

2.最大子序和

class Solution(object):
    def maxSubArray(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        tmp = 0
        maxnum = nums[0]
        for i in range(len(nums)):
            tmp += nums[i]
            maxnum = max(tmp, maxnum)
            if tmp < 0:
                tmp = 0
        return maxnum
class Solution(object):
    def maxSubArray(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        for i in range(1,len(nums)):
            tmp = max(nums[i]+nums[i-1],nums[i])
            nums[i] = tmp
        return max(nums)

3.按摩师

class Solution(object):
    def massage(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if len(nums) == 0:
            return 0
        dp0, dp1 = 0, nums[0]
        for i in range(1, len(nums)):
            tdp0 = max(dp0, dp1)
            tdp1 = dp0 + nums[i]
            dp0, dp1 = tdp0, tdp1
        return max(dp0, dp1)           

4.买卖股票的最佳时机

class Solution(object):
    def maxProfit(self, prices):
        """
        :type prices: List[int]
        :rtype: int
        """
        minprice = int(1e9)
        maxprofit = 0
        for price in prices:
            maxprofit = max(price - minprice, maxprofit)
            minprice = min(price, minprice)
        return maxprofit

5.打家劫舍

class Solution(object):
    def rob(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if len(nums) == 0:
            return 0
        
        dp0 = 0
        dp1 = nums[0]
        for i in range(1,len(nums)):
            tdp0 = max(dp0, dp1)
            tdp1 = dp0 + nums[i]
            dp0, dp1 = tdp0, tdp1
        return max(dp0, dp1)

6.使用最小话费爬楼梯

class Solution(object):
    def minCostClimbingStairs(self, cost):
        """
        :type cost: List[int]
        :rtype: int
        """
        dp = [0] * (len(cost)+1)
        for i in range(2,len(cost)+1):
            dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])
        return dp[len(cost)]

7.连续子数组的最大和

class Solution(object):
    def maxSubArray(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        thesum = 0
        submax = nums[0]
        for i in range(len(nums)):
            thesum += nums[i]
            submax = max(submax, thesum)
            if thesum < 0:
                thesum = 0
        return submax

8.区域和检索-数组不可变

class NumArray(object):

    def __init__(self, nums):
        """
        :type nums: List[int]
        """
        self.nums = nums


    def sumRange(self, i, j):
        """
        :type i: int
        :type j: int
        :rtype: int
        """
        thesum = 0
        for idx in range(i,j + 1):
            thesum += self.nums[idx]
        return thesum
        


# Your NumArray object will be instantiated and called as such:
# obj = NumArray(nums)
# param_1 = obj.sumRange(i,j)

9.三步问题

class Solution(object):
    def waysToStep(self, n):
        """
        :type n: int
        :rtype: int
        """
        if n == 1:
            return 1
        if n ==2:
            return 2
        if n ==  3:
            return 4
        if n > 3:
            return (self.waysToStep(n-1) + self.waysToStep(n-2) + self.waysToStep(n-3)) % 1000000007
(超时)
class Solution(object):
    def waysToStep(self, n):
        """
        :type n: int
        :rtype: int
        """
        if n == 1:
            return 1
        if n ==2:
            return 2
        tmp1, tmp2, tmp3 = 1, 2, 4
        for i in range(3, n):
            tmp1, tmp2, tmp3 = tmp2, tmp3, tmp1 + tmp2 + tmp3
            tmp1 %= 1000000007
            tmp2 %= 1000000007
            tmp3 %= 1000000007
        return tmp3

10.爬楼梯

class Solution(object):
    def climbStairs(self, n):
        """
        :type n: int
        :rtype: int
        """
        if n == 1:
            return 1
        if n == 2:
            return 2
        tmp1, tmp2 = 1, 2
        for i in range(2, n):
            tmp1, tmp2 = tmp2, tmp1 + tmp2
        return tmp2

11.连续数列

class Solution(object):
    def maxSubArray(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        for i in range(1,len(nums)):
            tmp = max(nums[i] + nums[i - 1], nums[i])
            nums[i] = tmp
        return max(nums)

12.判断子序列

class Solution(object):
    def isSubsequence(self, s, t):
        """
        :type s: str
        :type t: str
        :rtype: bool
        """
        i, j = 0, 0
        len_s = len(s)
        len_t = len(t)
        while i < len_s and j < len_t:
            if s[i] == t[j]:
                i += 1
            j += 1
        return i==len_s

13.一和零

class Solution(object):
    def findMaxForm(self, strs, m, n):
        """
        :type strs: List[str]
        :type m: int
        :type n: int
        :rtype: int
        """
        dp = [[0] * (n + 1) for _ in range(m + 1)]

        for str in strs:
            zeros, ones = str.count('0'), str.count('1')
            for i in range(m, zeros - 1, -1):
                for j in range(n, ones - 1, -1):
                    dp[i][j] = max(dp[i][j], dp[i - zeros][j - ones] + 1)
        return dp[m][n]

14.最长上升子序列

class Solution(object):
    def lengthOfLIS(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        dp = [1] * len(nums)
        for i in range(len(nums)):
            for j in range(i):
                if nums[i] > nums[j]:
                    dp[i] = max(dp[i], dp[j] + 1)
        return max(dp)

15.最长湍流子数组

class Solution(object):
    def maxTurbulenceSize(self, arr):
        """
        :type arr: List[int]
        :rtype: int
        """
        if len(arr) == 1:
            return 1
        dp = [[1] * 2 for _ in range(len(arr))]
        result = 0
        for i in range(1, len(arr)):
            if arr[i - 1] < arr[i]:
                dp[i][1] = dp[i - 1][0] + 1
            if arr[i - 1] > arr[i]:
                dp[i][0] = dp[i - 1][1] + 1
            result = max(result, max(dp[i]))
        return result

16.K站中转内最便宜的航班

class Solution(object):
    def findCheapestPrice(self, n, flights, src, dst, K):
        """
        :type n: int
        :type flights: List[List[int]]
        :type src: int
        :type dst: int
        :type K: int
        :rtype: int
        """
        dist = [[float("inf")] * n for _ in range(2)]
        dist[0][src] = dist[1][src] = 0
        for i in xrange(K + 1):
            for u, v, w in flights:
                dist[i & 1][v] = min(dist[i & 1][v], dist[~ i & 1][u] + w)
        return dist[K & 1][dst] if dist[K & 1][dst] < float("inf") else -1

17.

class Solution(object):
    def new21Game(self, N, K, W):
        """
        :type N: int
        :type K: int
        :type W: int
        :rtype: float
        """
        if K == 0:
            return 1.0
        dp =[0.0] * (K + W)
        for i in range(K, min(N, K + W - 1) + 1):
            dp[i] = 1.0
        dp[K - 1] = float(min(N - K + 1, W)) / W
        for i in range(K - 2, -1, -1):
                dp[i] = dp[i + 1] - (dp[i + W + 1] - dp[i + 1]) / W
        return dp[0]
class Solution(object):
    def new21Game(self, N, K, W):
        """
        :type N: int
        :type K: int
        :type W: int
        :rtype: float
        """
        dp = [0.0] * (K + W)
        s = 0
        for i in range(K, K + W):
            dp[i] = 1 if i <= N else 0
            s += dp[i]
        for i in range(K-1, -1, -1):
            dp[i] = float(s)/W
            s = s - dp[i + W] + dp[i]
        return dp[0]

18.统计字典序元音字符串的数目

class Solution(object):
    def countVowelStrings(self, n):
        """
        :type n: int
        :rtype: int
        """
        dp = [[0] * 5 for _ in range(n + 1)]
        dp[1][0] = 1
        dp[1][1] = 2
        dp[1][2] = 3
        dp[1][3] = 4
        dp[1][4] = 5
        for i in range(2, n + 1):
            for j in range(0,5):
                if j == 0:
                    dp[i][j] = dp[i - 1][j]
                else:
                    dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
        return dp[n][4]

19.剪绳子 II

class Solution(object):
    def cuttingRope(self, n):
        """
        :type n: int
        :rtype: int
        """
        if n <= 3:
            return n - 1
        a, b, p = n // 3, n % 3, 1000000007
        if b == 0:
            return 3 ** a % p
        elif b == 1:
            return 3 ** (a - 1) * 4 % p
        else:
            return 3 ** a * 2 % p

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值