当前位置: 首页 > 知识库问答 >
问题:

最大和递增子序列

谢洛城
2023-03-14

所以我用动态编程做了一个简单的python代码来解决最大递增子序列的问题。问题如下:

给定一个数组 arr 的 N 个正整数。求出给定数组的最大和递增子序列的总和。

输入:输入的第一行包含一个整数 T,表示测试用例的数量。每个测试用例的第一行是 N(数组的大小)。每个测试用例的第二行包含数组元素。

输出:对于每个测试用例,在新行中打印所需的答案。

在我的解决方案中,我正在计算一个名为“总和”的列表中的最大总和。

#code
T = int(input())
for _ in range(T):
    N = int(input())
    arr = list(map(int, input().split()))
    sums = list(arr)
    max_sum = arr[0]

    for j in range(1,N):
        for i in range(0,j):
            if arr[i]<arr[j] and sums[j]<sums[i]+arr[j]:
                sums[j] = (sums[i]+arr[j])
                if sums[j]>max_sum:
                    max_sum = sums[j]

    print(max_sum)

我的输出:你的程序花费了比预期更多的时间。超出时间限制。预期时间限制

如何进一步优化此代码?

共有2个答案

蒋波光
2023-03-14

更多可读性:

def maxSumIncreasingSubsequence(array):

    sums = [num for num in array]
    maxSumIdx = 0

    for i in range(len(array)):
        currVal = array[i]
        for j in range(i):
            prevVal = array[j]
            if currVal > prevVal and sums[j] + currVal >= sums[i]:
                sums[i] = sums[j] + currVal
     
        if sums[i] >= sums[maxSumIdx]:
            maxSumIdx = i

    return sums[maxSumIdx] 

T = int(input())
for _ in range(T):
    N = int(input())
    arr = list(map(int, input().split()))
    maxSumIncreasingSubsequence([10, 70, 20, 30, 50, 11, 30])
叶书
2023-03-14

我想这能行

def max_inc(a):
    max = a[0]
    prev = a[0]
    current = a[0]
    for i in range(1,len(a)):
        if a[i]>prev:
            current+=a[i]
            if current>max:
                max = current
        else:
            current = 0
        prev = a[i]
    return max

在O(n)中

 类似资料:
  • 给定n个正整数的数组。这是一个寻找给定数组的最大和子序列的和的程序,使得子序列中的整数按升序排列。我试图实现基于这个YouTube视频的代码,我不知道我做错了什么。

  • 我在阅读了允许K个异常的最长递增子序列后创建了这个线程。我意识到提问的人并没有真正理解这个问题,因为他指的是一个链接,该链接解决了“允许一次更改的最长递增子数组”问题。所以他得到的答案实际上与李的问题无关。 假设给定一个长度为N的数组A。查找允许K个异常的最长递增子序列。 示例:N=9,K=1 A=[3,9,4,5,8,6,1,3,7] 答案:7 说明: 最长递增子序列为:3,4,5,8(或6),

  • 最长增子序列是我们熟知的问题,我用耐心算法给出了一个解决方案。 我曾想过先用我的算法,然后找到长度为N的第一个序列,但不知道该怎么做。 那么,如何从随机整数序列中找到第一个最长的递增子序列呢? 我的代码段: 我的代码返回:1 2 8 第一个序列是:3 6 8 另一个例子: 我的代码正确返回:1 2 3 基本上,只要第一个最长序列与最佳最长序列相同,我的代码就能工作。但是当你有一堆相同长度的最长序列

  • LIS:最长递增子序列问题是寻找给定序列的子序列,其中子序列的元素按从低到高的顺序排序 例如: 0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15 此算法是否? 你能解释一下吗?

  • 在最多一个序列存在重复的情况下,可以将最长公共子序列问题转化为最长递增子序列问题。减少问题的过程说明在这里: 假设您有以下序列: 然后,创建一个整数序列S3,其中您必须将S2的每个元素的位置放在S1中(如果元素在S1中不存在,那么忽略那个元素)。在本例中: 这种方法是如何工作的?为什么这种约简解决了寻找最长公共子序列的问题?

  • 我为最长的递增子序列编写了一个递归解,它运行得非常好。但是当我在同一个代码上应用dp时,它给出了不同的答案。问题链接:https://practice.geeksforgeeks.org/problems/longest-increasing-subsequence-1587115620/1递归代码: DP代码: 我不知道我做错了什么?对于这个测试用例6(n)6 3 7 4 6 9(arr[]),