📜  门| GATE-CS-2017(Set 1)|第48章(1)

📅  最后修改于: 2023-12-03 15:12:43.846000             🧑  作者: Mango

门 | GATE-CS-2017(Set 1) | 第48章

本篇文章主要介绍了GATE计算机科学考试2017年(Set 1)的第48章中涉及的相关知识点,如下所示。

题目描述

一个长度为n的非空数组a,定义了一个子序列,里面的元素呈现单调递增或递减的状态。现在,定义子序列的“价值”为其长度加所有元素的和。例如,在整个数组中,子序列[5,3,2]的价值为3 + 5 + 3 + 2 = 13。现在,需要产生一个新的数组,包含从给定数组中得到子序列的所有价值,其长度范围是2到n(包括2和n)。你的任务是得到这个数组。

例如:

Input:  1 2 3 1 2
Output: 0 6 7 3 5
解法

我们可以使用两个数组left和right,left用于存储从左到右的子序列的最大价值,right用于存储从右到左的子序列的最大价值。然后,我们计算每个子序列的价值,直到数组的长度。代码如下所示。

def find_values(arr):
    n = len(arr)
    left, right = [], []
    left.append([-1, 0])
    for i in range(1, n):
        if arr[i] > arr[i - 1]:
            left.append([i - 1, left[-1][1] + arr[i - 1]])
        else:
            left.append([-1, left[-1][1]])
    right.append([-1, 0])
    for i in range(n - 2, -1, -1):
        if arr[i] > arr[i + 1]:
            right.append([i + 1, right[-1][1] + arr[i + 1]])
        else:
            right.append([-1, right[-1][1]])
    right = right[::-1]
    values = [0] * (n - 1)
    for i in range(2, n + 1):
        if left[i - 1][0] != -1 and right[i - 2][0] != -1:
            values[i - 2] = left[i - 1][1] + right[i - 2][1] + arr[i - 1] * (i - 2)
    return [0] + values + [0]
总结

本篇文章主要介绍了GATE计算机科学考试2017年(Set 1)的第48章中涉及到的子序列问题,并给出了解决方案和示例代码。