动态规划 序列

本文探讨了动态规划在解决最长上升子序列和最长连续递增序列问题中的应用。以具体示例说明如何找到这些序列,并介绍了在不同情况下解题策略,包括考虑序列的连续性和不连续性。此外,还涉及寻找最长递增子序列的个数,以及如何使用dp数组记录相关信息。
摘要由CSDN通过智能技术生成

300 最长上升子序列 (不连续,有顺序)
最长递增子序列
输入: [10,9,2,5,3,7,101,18]
输出: 4
【2,3,7,101】满足题意
解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。

def lengthOfLIS(self, nums: List[int]) -> int:
        if not nums: return 0
        n = len(nums)
        dp = [1 for i in range(n)]
        #dp[i] 所有元素置 1,含义是每个元素都至少可以单独成为子序列,此时长度都为 1
        for i in range(1,n):
            for j in range(i):
                if nums[i] > nums[j] :
                    dp[i] = max(dp[i],dp[j]+1)
        return max(dp) #返回 dp 列表最大值,即可得到全局最长上升子序列长度
        #定义 dp[i] 为考虑前i个元素,以第i个数字结尾的最长上升子序列的长度,注意 nums[i] 必须被选取.

674 最长连续递增序列 (连续)
输入:【1,3,5,4,7】
输出:3
【1,3,5】满足题意
【1,3,5,7】不满足

def findLengthOfLCIS(nums):
	if not nums: return 0
	n = len(nums)
	dp=[1]*n
	for i in range(1,n):
		if nums[i]>nums[i-1]:
			dp[i]=dp[i-1]+1
	return max(dp)
  1. 最长递增子序列的个数 (不连续) 2个动态规划
    给定一个未排序的整数数组,找到最长递增子序列的个数。
    输入: [1,3,5,4,7]
    输出: 2
    解释: 有两个最长递增子序列,分别是 [1, 3, 4, 7] 和[1, 3, 5, 7]。
    dp[i]表示以i位置结尾,即数组中以nums[i]结尾的最长连续递增序列长度;
    dp_num[i]表示数组中以nums[i]结尾的最长连续递增的组合数量

    例子:【1,2,4,3,5,4,7,2】
    【1,2,4,5,7】、【1,2,3,5,7】、【1,2,3,4,7】以nums[6]=7结尾的dp_num =3
def findNumberOfLIS(self, nums: List[int]) -> int:
        if not nums: return 0
        n = len(nums)
        max_ans = 1 
        dp = [1 for i in range(n)]  #记录长度
        dp_num = [1 for i in range(n)] #记录最长的个数
        dp[0] = 1
        for i in range(1,n):
            for j in range(i):
                if nums[i] > nums[j]:
                    if dp[j]+1>dp[i]:
                       dp[i] = dp[j]+1
                       max_ans = max(max_ans,dp[i])
                       dp_num[i] = dp_num[j]  #组合数本身不变
                    elif dp[i] == dp[j] + 1: #说明最长的长度已经再次出现了,需要累加计次数
                        dp_num[i] += dp_num[j]
        cnt = 0
        for i in range(n):
            if dp[i] == max_ans:
                cnt += dp_num[i]
        return cnt
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值