คำชี้แจงปัญหา
รับอาร์เรย์ 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