Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ผลรวมสมดุลสูงสุดในอาร์เรย์ใน C++


คำชี้แจงปัญหา

รับอาร์เรย์ arr[] ค้นหาค่าสูงสุดของผลรวมคำนำหน้าซึ่งเป็นผลรวมต่อท้ายสำหรับดัชนี i ใน arr[]

ตัวอย่าง

หากอาร์เรย์อินพุตเป็น −

Arr[] ={1, 2, 3, 5, 3, 2, 1} ดังนั้นเอาต์พุตคือ 11 เป็น −

  • ผลรวมคำนำหน้า =arr[0..3] =1 + 2 + 3 + 5 =11 และ
  • คำต่อท้าย =arr[3..6] =5 + 3 + 2 + 1 =11

อัลกอริทึม

  • สำรวจอาร์เรย์และเก็บผลรวมคำนำหน้าสำหรับแต่ละดัชนีในอาร์เรย์ presum[] ซึ่ง presum[i] จะเก็บผลรวมของ subarray arr[0..i]
  • สำรวจอาร์เรย์อีกครั้งและเก็บผลรวมต่อท้ายไว้ในคำต่อท้ายอาร์เรย์อื่น[] ซึ่ง suffsum[i] จะเก็บผลรวมของ subarray arr[i..n-1]
  • สำหรับดัชนีแต่ละรายการ ให้ตรวจสอบว่า presum[i] เท่ากับ suffsum[i] หรือไม่ และหากเท่ากันก็ให้เปรียบเทียบ มีค่ากับค่าสูงสุดโดยรวมจนถึงตอนนี้

ตัวอย่าง

#include <bits/stdc++.h>
using namespace std;
int getMaxSum(int *arr, int n) {
   int preSum[n];
   int suffSum[n];
   int result = INT_MIN;
   preSum[0] = arr[0];
   for (int i = 1; i < n; ++i) {
      preSum[i] = preSum[i - 1] + arr[i];
   }
   suffSum[n - 1] = arr[n - 1];
   if (preSum[n - 1] == suffSum[n - 1]) {
      result = max(result, preSum[n - 1]);
   }
   for (int i = n - 2; i >= 0; --i) {
      suffSum[i] = suffSum[i + 1] + arr[i];
      if (suffSum[i] == preSum[i]) {
         result = max(result, preSum[i]);
      }
   }
   return result;
}
int main() {
   int arr[] = {1, 2, 3, 5, 3, 2, 1};
   int n = sizeof(arr) / sizeof(arr[0]);
   cout << "Max equlibrium sum = " << getMaxSum(arr, n) << endl;
   return 0;
}

ผลลัพธ์

เมื่อคุณคอมไพล์และรันโปรแกรมข้างต้น มันสร้างผลลัพธ์ต่อไปนี้ -

Max equlibrium sum = 11