Computer >> Máy Tính >  >> Lập trình >> C ++

Tổng tối đa của hai mảng con không chồng chéo trong C ++

Giả sử chúng ta có một mảng A gồm các số nguyên; chúng ta phải tìm tổng lớn nhất của các phần tử trong hai mảng con không trùng nhau. Độ dài của các mảng con này là L và M.

Vì vậy, chính xác hơn chúng ta có thể nói rằng, chúng ta phải tìm V lớn nhất mà

V =(A [i] + A [i + 1] + ... + A [i + L-1]) + (A [j] + A [j + 1] + ... + A [j + M-1]) và một trong hai -

  • 0 <=i

  • 0 <=j

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

  • n:=kích thước của A

  • Xác định mảng leftL có kích thước n, Xác định mảng leftM có kích thước n

  • Xác định mảng rightL có kích thước n, Xác định một mảng rightM có kích thước n

  • ret:=0, temp:=0

  • để khởi tạo i:=0, khi i

    • temp =temp + A [i]

  • để khởi tạo i:=L, j:=0, khi i

    • leftL [i - 1]:=max of temp và x trong đó x là 0 khi i - 2 <0, ngược lại x =leftL [i - 2]

    • temp =temp + A [i]

    • temp =temp - A [j]

  • leftL [n - 1]:=max của nhiệt độ và x trong đó x là 0 khi n - 2 <0, ngược lại x:=leftL [n - 2]

  • tạm thời:=0

  • để khởi tạo i:=0, khi i

    • temp =temp + A [i]

  • để khởi tạo i:=M, j:=0, khi i

    • temp =temp + A [i]

    • temp =temp - A [j]

  • leftM [n - 1]:=max của nhiệt độ và x khi x:=0 nếu n - 2 <0 nếu không x:=leftM [n - 2]

  • tạm thời:=0

  • để khởi tạo i:=n - 1, khi i> n - 1 - L, giảm i đi 1 do -

    • temp =temp + A [i]

  • để khởi tạo i:=n - 1 - L, j:=n - 1, khi i> =0, giảm i đi 1, giảm j đi 1, do -

    • rightL [i + 1]:=max of temp và x trong đó x là 0 nếu i + 2> =n ngược lại x =rightL [i + 2]

    • temp =temp + A [i]

    • temp =temp - A [j]

  • rightL [0]:=max of temp và rightL [1]

  • tạm thời:=0

  • để khởi tạo i:=n - 1, khi i> n - 1 - M, giảm i đi 1 do -

    • temp =temp + A [i]

  • để khởi tạo i:=n - 1 - M, j:=n - 1, khi i> =0, giảm i đi 1, giảm j đi 1, do -

    • rightM [i + 1]:=max của temp và x, trong đó x là 0 khi i + 2> =n ngược lại x:=rightM [i + 2]

    • temp =temp + A [i]

    • temp =temp - A [j]

  • rightM [0]:=max of temp và rightM [1]

  • để khởi tạo i:=L - 1, khi i <=n - 1 - M, tăng i lên 1 do -

    • ret:=max của ret và leftL [i] + rightM [i + 1]

  • để khởi tạo i:=M - 1, khi i <=n - 1 - L, hãy tăng i lên 1 do -

    • ret:=max of ret và leftM [i] + rightL [i + 1]

  • trả lại ret

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

Ví dụ

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int maxSumTwoNoOverlap(vector<int>& A, int L, int M) {
      int n = A.size();
      vector <int> leftL(n);
      vector <int> leftM(n);
      vector <int> rightL(n);
      vector <int> rightM(n);
      int ret = 0;
      int temp = 0;
      for(int i = 0; i < L; i++){
         temp += A[i];
      }
      for(int i = L, j = 0; i < n; i++, j++){
         leftL[i − 1] = max(temp, i − 2 < 0 ? 0 : leftL[i − 2]);
         temp += A[i];
         temp −= A[j];
      }
      leftL[n − 1] = max(temp, n − 2 < 0 ? 0 : leftL[n − 2]);
      temp = 0;
      for(int i = 0; i < M; i++){
         temp += A[i];
      }
      for(int i = M, j = 0; i < n; i++, j++){
         leftM[i − 1] = max(temp, i − 2 < 0 ? 0 : leftM[i − 2]);
         temp += A[i];
         temp −= A[j];
      }
      leftM[n − 1] = max(temp, n − 2 < 0 ? 0 : leftM[n − 2]);
      //out(leftM);
      temp = 0;
      for(int i = n − 1; i > n − 1 − L; i−−){
         temp += A[i];
      }
      for(int i = n − 1 − L, j = n − 1; i >= 0 ; i−−, j−− ){
         rightL[i + 1] = max(temp, (i + 2 >= n ? 0 : rightL[i + 2]));
         temp += A[i];
         temp −= A[j];
      }
      rightL[0] = max(temp, rightL[1]);
      temp = 0;
      for(int i = n − 1; i > n − 1 − M; i−−){
         temp += A[i];
      }
      for(int i = n − 1 − M, j = n − 1; i >= 0 ; i−−, j−− ){
         rightM[i + 1] = max(temp, (i + 2 >= n ? 0 : rightM[i + 2]));
         temp += A[i];
         temp −= A[j];
      }
      rightM[0] = max(temp, rightM[1]);
      for(int i = L − 1; i <= n − 1 − M; i++){
         ret = max(ret, leftL[i] + rightM[i + 1]);
      }
      for(int i = M − 1; i <= n − 1 − L; i++){
         ret = max(ret, leftM[i] + rightL[i + 1]);
      }
      return ret;
   }
};
main(){
   Solution ob;
   vector<int> v1 = {0,6,5,2,3,5,1,9,4};
   cout << (ob.maxSumTwoNoOverlap(v1, 1, 2));
}

Đầu vào

[0,6,5,2,3,5,1,9,4]
1
2

Đầu ra

20