• 代码随想录算法训练营第五十天| LeetCode1035.不相交的线、53. 最大子序和、392.判断子序列、115.不同的子序列


    1035.不相交的线

    题目描述: 1035.不相交的线.

    解法

    二维dp
    class Solution(object):
        def maxUncrossedLines(self, nums1, nums2):
            dp = [[0]*(len(nums1)+1) for _ in range(len(nums2)+1)]
            for i in range(1,len(nums2)+1):
                for j in range(1,len(nums1)+1):
                    if nums2[i-1] == nums1[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[len(nums2)][len(nums1)]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    因为要找不相交的所有相等线,而且连线的顺序绝对遵守原顺序,所以其实就是找最长相等子序列。

    滚动dp
    class Solution(object):
        def maxUncrossedLines(self, nums1, nums2):
            dp = [0] * (len(nums1)+1)
            for i in range(1,len(nums2)+1):
                pre = 0
                for j in range(1,len(nums1)+1):
                    cur = dp[j]
                    if nums1[j-1] == nums2[i-1]:
                        dp[j] = pre + 1
                    else:
                        dp[j] = max(dp[j],dp[j-1])
                    pre = cur
            return dp[len(nums1)]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    53. 最大子序和

    题目描述: 53. 最大子序和.

    解法

    dp
    class Solution(object):
        def maxSubArray(self, nums):
            dp = [0] * len(nums)
            dp[0] = nums[0]
            res = nums[0]
            for i in range(1,len(nums)):
                dp[i] = max(dp[i-1]+nums[i],nums[i])
                res = max(dp[i],res)
            return res
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    392.判断子序列

    题目描述: 392.判断子序列.

    解法

    二维dp
    class Solution(object):
        def isSubsequence(self, s, t):
            dp= [[0]*(len(s)+1) for _ in range(len(t)+1)]
            for i in range(1,len(t)+1):
                for j in range(1,len(s)+1):
                    if s[j-1] == t[i-1]:
                        dp[i][j] = dp[i-1][j-1]+1
                    else:
                        dp[i][j] = dp[i-1][j]
            return dp[len(t)][len(s)] == len(s)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    开始编辑距离了

    滚动dp
    class Solution(object):
        def isSubsequence(self, s, t):
            dp = [0]*(len(s)+1)
            for i in range(1,len(t)+1):
                for j in range(len(s),0,-1):
                    if t[i-1] == s[j-1]:
                        dp[j] = dp[j-1] + 1
                    else:
                        dp[j] = dp[j]
            return dp[len(s)] == len(s)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    如果是由上或者左上决定的,那么就可以用滚动数组,遍历倒叙。如果是由左决定的,使用滚动数组时要正序并且进行记录

    115.不同的子序列

    题目描述: 115.不同的子序列.

    解法

    二维dp
    class Solution(object):
        def numDistinct(self, s, t):
            # 在s中找t
            # i是t,j是s
            dp = [[0] * (len(s)+1) for _ in range(len(t)+1)]
            for i in range(len(s)+1):
                dp[0][i] = 1
            for i in range(1,len(t)+1):
                for j in range(1,len(s)+1):
                    if t[i-1] == s[j-1]:
                        dp[i][j] = dp[i-1][j-1] + dp[i][j-1]
                    else:
                        dp[i][j] = dp[i][j-1]
            return dp[-1][-1]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    一定要注意初始化,此外状态转移也要思考好,i和j的顺序其实无所谓。

  • 相关阅读:
    AI人脸检测/安全帽检测智能分析网关告警消息配置——微信告警消息配置
    4795: 【PY】【C1】【分支】寄快递
    一键搞定,火车站媒体信息发布系统解决方案
    web中视频流的工作原理
    054协同过滤算法的电影推荐系统
    《30天吃掉那只 TensorFlow2.0》五、TensorFlow的中阶API
    Mysql事务日志
    创建一个Django项目
    外包干了2个月,技术退步明显...
    虚拟机设置固定ip
  • 原文地址:https://blog.csdn.net/WindyAikos/article/details/132881525