สมมติว่าเรามีอาร์เรย์ของจำนวนเต็ม เราต้องหาผลรวมสูงสุดสำหรับ subarray ที่ไม่ว่างเปล่า (องค์ประกอบที่ต่อเนื่องกัน) โดยมีการลบองค์ประกอบไม่เกินหนึ่งรายการ กล่าวอีกนัยหนึ่ง เราสามารถพูดได้ว่าเราต้องการเลือกอาร์เรย์ย่อยและเลือกที่จะลบหนึ่งองค์ประกอบออกจากมัน เพื่อให้ยังมีองค์ประกอบเหลืออย่างน้อยหนึ่งองค์ประกอบ และผลรวมขององค์ประกอบที่เหลือจะสูงสุด เราต้องจำไว้ว่า subarray จะต้องไม่ว่างเปล่าหลังจากลบหนึ่งองค์ประกอบ ดังนั้นหากอินพุตเป็น [1,-2,0,3] ผลลัพธ์จะเป็น 4 ดังนั้นหากเราลบ -2 มันจะคืนค่าผลรวมสูงสุด
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- n :=ขนาดของอาร์เรย์ และ :=a[0]
- suff_with_del :=0, suff_with_out_del :=a[0]
- สำหรับ i ในช่วง i ถึง n – 1
- suff_with_del :=สูงสุดของ suff_with_del + a[i] และ suff_with_out_del
- suff_with_out_del :=สูงสุดของ a[i] และ suff_with_out_del + a[i]
- ans :=สูงสุดของ ans, suff_with_out_del และ suff_with _del
- ผลตอบแทน
ตัวอย่าง(C++)
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h> using namespace std; class Solution { public: int maximumSum(vector<int>& a) { int n = a.size(); int ans = a[0]; int suffix_with_deletion = 0; int suffix_with_not_deletion = a[0]; for(int i = 1;i<n;i++){ suffix_with_deletion = max(suffix_with_deletion + a[i], suffix_with_not_deletion); suffix_with_not_deletion = max(a[i],suffix_with_not_deletion+a[i]); ans = max({ans, suffix_with_not_deletion,suffix_with_deletion}); } return ans; } }; main(){ vector<int> v = {1,-2,0,3}; Solution ob; cout <<ob.maximumSum(v); }
อินพุต
[1,-2,0,3]
ผลลัพธ์
4