ในปัญหานี้เราได้รับอาร์เรย์ งานของเราคือสร้างโปรแกรมที่จะค้นหาผลรวมของ subarray สูงสุดที่ลบองค์ประกอบใน c++ ได้ไม่เกินหนึ่งองค์ประกอบ
โดยพื้นฐานแล้ว เราจำเป็นต้องหาองค์ประกอบหนึ่งซึ่งเมื่อนำออกแล้วจะให้ผลรวมสูงสุดสำหรับองค์ประกอบที่เหลืออยู่ในอาร์เรย์
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน
ป้อนข้อมูล − อาร์เรย์ ={5, 1, 9, 2, -1, 7}
ผลผลิต − 24
คำอธิบาย − เราได้ลบ -1 ออกจากอาร์เรย์ และผลรวมกลายเป็นค่าสูงสุดของผลลัพธ์ที่เป็นไปได้ทั้งหมด
วิธีแก้ไขปัญหานี้คือการค้นหาองค์ประกอบขั้นต่ำของอาร์เรย์แล้วค้นหาผลรวมขององค์ประกอบที่เหลือทั้งหมดของอาร์เรย์
แต่ในที่นี้ ไม่มีการนำเงื่อนไขการนำองค์ประกอบออก อัลกอริทึมของ kadane จะแก้ปัญหาในทางที่ดีขึ้น ดังนั้น ที่นี่เราจะคำนวณผลรวมสูงสุดในลักษณะที่เราจะพบองค์ประกอบ sum ถึง ith ตั้งแต่เริ่มต้นและสิ้นสุดด้วย
จากนั้นตรวจสอบว่าองค์ประกอบใดเมื่อข้ามโดยใช้อาร์เรย์ผลรวมเริ่มต้นและสิ้นสุด จากนั้นพิมพ์ผลรวมหลังจากข้ามองค์ประกอบที่กำหนด
ตัวอย่าง
โปรแกรมแสดงการใช้งานโซลูชันของเรา
#include <bits/stdc++.h>
using namespace std;
int maxSubarraySum(int array[], int n){
int startSum[n], endSum[n];
int maxSum = array[0], overAllMax = array[0];
startSum[0] = array[0];
for (int i = 1; i < n; i++){
maxSum = max(array[i], maxSum + array[i]);
overAllMax = max(overAllMax, maxSum);
startSum[i] = maxSum;
}
maxSum = endSum[n-1] = array[n-1];
for (int i = n-2; i >= 0; i--){
maxSum = max(array[i], maxSum + array[i]);
overAllMax = max(overAllMax, maxSum);
endSum[i] = maxSum;
}
int SubArraySum = overAllMax;
for (int i = 1; i < n - 1; i++)
SubArraySum = max(SubArraySum, startSum[i - 1] + endSum[i + 1]);
return SubArraySum;
}
int main()
{
int array[] = {5, 7, 1, -1, 4, 2, 9};
int n = sizeof(array) / sizeof(array[0]);
cout<;"The maximum subarray after removing one element is "<<maxSubarraySum(array, n);
return 0;
} ผลลัพธ์
The maximum subarray after removing one element is 28