leetcode 1031. 2つの非オーバーラップサブ配列の最大和(C++)

1744 ワード

非負の整数配列Aが与えられ、2つの非オーバーラップ(連続)サブ配列中の要素の最大和が返され、サブ配列の長さはそれぞれLおよびMである.(ここで明らかにする必要があるのは、長さLのサブ配列がMのサブ配列の前または後に現れることである.)
形式的には、最大のVを返し、V = (A[i] + A[i+1] + ... + A[i+L-1]) + (A[j] + A[j+1] + ... + A[j+M-1])は、次のいずれかの条件を満たします.
 
  • 0 <= i < i + L - 1 < j < j + M - 1 < A.length、または
  • 0 <= j < j + M - 1 < i < i + L - 1 < A.length .

  •  
    例1:
    A = [0,6,5,2,2,5,1,9,4], L = 1, M = 2
    20
             ,[9]     1,[6,5]     2。
    

    例2:
    A = [3,8,1,3,2,1,8,9,0], L = 3, M = 2
    29
             ,[3,8,1]     3,[8,9]     2。
    

    例3:
    A = [2,1,5,6,0,9,5,0,3,8], L = 4, M = 3
    31
             ,[5,6,0,9]     4,[0,3,8]     3。

     
    ヒント:L >= 1 M >= 1 L + M <= A.length <= 1000 0 <= A[i] <= 1000 C++
    class Solution {
    public:
        bool func(int i, int j, int n, int L, int M)
        {
            if(i+L<=n && j+M<=n && (i+L<=j || j+M<=i))
            {
                return true;
            }
            return false;
        }
        
        int maxSumTwoNoOverlap(vector& A, int L, int M) 
        {
            int ans=0;
            int n=A.size();
            vector tmp(n+1);
            tmp[0]=0;
            for(int i=0;i