zoukankan      html  css  js  c++  java
  • 再探动态规划——lettcode689三个无重叠数组的最大和

    题目

    这个问题中,很难找直接到显示的动态转移方程(参考Floyd算法、背包问题等),需要先进行问题的铺垫转化,最后再用条件转移方程 if ... then...得到结果

    在解决问题的过程中,一般的会先确定一个未知数,在这个未知数的值已知的情况下再去计算其他的未知数。

    在这个问题中,我们要找三个数组,先将这些数组组成的值用w[]记录下来,设三个数组的起始下标分别为i,j,l。

    先分别从w[]的两端遍历得到left[]和right[],left[i]&right[i]分别记录当前遍历的w[]最大值的下标

    再对j进行遍历,每一次按j值选取i,l: i = left[j-k] ; l = right[j+k];用ans[]记录三个无重叠数组之和

    最后经初始化后进入条件转移:if w[i] + w[j] + w[l] > w[ans[0]] + w[ans[1]] + w[ans[2]]: ans = i,j,l

    class Solution:
        def maxSumOfThreeSubarrays(self, nums: List[int], k: int) -> List[int]:
            W = [] #array of sums of windows
            curr_sum = 0
            for i, x in enumerate(nums):
                curr_sum += x
                if i >= k: 
                    curr_sum -= nums[i - k]
                if i >= k - 1: 
                    W.append(curr_sum)
    
            left = [0] * len(W)
            best = 0
            for i in range(len(W)):
                if W[i] > W[best]:
                    best = i
                left[i] = best
    
            right = [0] * len(W)
            best = len(W) - 1
            for i in range(len(W) - 1, -1, -1):
                if W[i] >= W[best]:
                    best = i
                right[i] = best
    
            ans = None
            for j in range(k, len(W) - k):
                i, l = left[j - k], right[j + k]
                if ans is None or (W[i] + W[j] + W[l] > W[ans[0]] + W[ans[1]] + W[ans[2]]):
                    ans = i, j, l
            return ans
  • 相关阅读:
    java 反编译和文档生成器
    java 导入自定义类
    hust 1010 最短循环节点
    KMP算法
    hiho 第119周 最大权闭合子图
    2007 Asia
    hiho 第1周 最长回文子串
    hiho 第118周 网络流四·最小路径覆盖
    hiho 第117周 二分图多重匹配,网络流解决
    成为一名JAVA高级工程师你需要学什么
  • 原文地址:https://www.cnblogs.com/yuelien/p/13719348.html
Copyright © 2011-2022 走看看