แนวคิด
เมื่อได้รับอาร์เรย์ A ที่มี N องค์ประกอบ และจำนวนเต็มสองจำนวน l และ r โดยที่ 1≤ ax ≤ 105 และ 1≤ l≤ r≤ N เราสามารถเลือกองค์ประกอบใดๆ ของอาร์เรย์ (สมมติว่าเป็น ax) และลบมันออก รวมถึงลบองค์ประกอบทั้งหมดที่เท่ากับ ax+1, ax+2 … ax+R และ ax-1, ax-2 … ax-L ออกจากอาร์เรย์ ขั้นตอนนี้จะใช้ค่า ax คะแนน งานของเราคือเพิ่มคะแนนรวมสูงสุดหลังจากลบองค์ประกอบทั้งหมดออกจากอาร์เรย์
อินพุต
2 1 2 3 2 2 1 l = 1, r = 1
เอาต์พุต
8
ที่นี่เราเลือก 2 เพื่อลบ แล้ว (2-1)=1 และ (2+1)=3 จะต้องถูกลบสำหรับช่วง l และ r ตามลำดับ
ทำซ้ำจนกว่า 2 จะถูกลบหมด ดังนั้นคะแนนรวม = 2*4 = 8
อินพุต
2 4 2 10 5 l = 1, r = 2
เอาต์พุต
18
ที่นี่เราเลือก 2 เพื่อลบ แล้ว 5 และ 10
ดังนั้นคะแนนรวม = 2*2 + 5 + 10 = 19
วิธีการ
เราจะหาจำนวนของทุกองค์ประกอบ สมมติว่าองค์ประกอบ X ถูกเลือก แล้วองค์ประกอบทั้งหมดในช่วง [X-l, X+r] จะถูกลบ ปัจจุบันเราเลือกช่วงน้อยที่สุดจาก l และ r และกำหนดว่าจะลบองค์ประกอบใดเมื่อเลือกองค์ประกอบ X ผลลัพธ์จะเป็นค่าสูงสุดขององค์ประกอบที่ถูกลบก่อนหน้านี้และเมื่อองค์ประกอบ X ถูกลบ ตอนนี้เราจะใช้ Dynamic Programming เพื่อเก็บผลลัพธ์ขององค์ประกอบที่ถูกลบก่อนหน้านี้และนำไปใช้ต่อ
ตัวอย่างโค้ด
// โปรแกรม C++ เพื่อหาค่าใช้จ่ายสูงสุดหลังจาก // ลบองค์ประกอบทั้งหมดออกจากอาร์เรย์ #include <bits/stdc++.h> using namespace std; // ฟังก์ชันแสดงการคืนค่าใช้จ่ายสูงสุดที่ได้ int maxCost(int a[], int m, int L, int R){ int mx1 = 0, k1; // หาองค์ประกอบสูงสุดของอาร์เรย์ for (int p = 0; p < m; ++p) mx1 = max(mx1, a[p]); // ใช้เริ่มต้นจำนวนของทุกองค์ประกอบเป็นศูนย์ int count1[mx1 + 1]; memset(count1, 0, sizeof(count1)); // คำนวณความถี่ของทุกองค์ประกอบของอาร์เรย์ for (int p = 0; p < m; p++) count1[a[p]]++; // ใช้เก็บค่าใช้จ่ายขององค์ประกอบที่ถูกลบ int res1[mx1 + 1]; res1[0] = 0; // เลือกช่วงน้อยที่สุดจาก L และ R L = min(L, R); for (int num1 = 1; num1 <= mx1; num1++) { // กำหนดว่าจะลบองค์ประกอบใดเมื่อเลือกองค์ประกอบ num k1 = max(num1 - L - 1, 0); // ได้ค่าสูงสุดเมื่อเลือกองค์ประกอบ num หรือไม่เลือก res1[num1] = max(res1[num1 - 1], num1 * count1[num1] + res1[k1]); } return res1[mx1]; } // โปรแกรมหลัก int main(){ int a1[] = { 1, 1, 3, 3, 3, 2, 4 }, l1 = 1, r1 = 1; int a2[] = { 2, 4, 2, 10, 5 }, l2 = 1, r2 = 2; // ขนาดของอาร์เรย์ int n1 = sizeof(a1) / sizeof(a1[0]); int n2 = sizeof(a2) / sizeof(a2[0]); // เรียกฟังก์ชันเพื่อหาค่าใช้จ่ายสูงสุด cout<<"Maximum Cost for First Example:" << maxCost(a1, n1, l1,r1)<<endl; cout<<"Maximum Cost for Second Example:" << maxCost(a2, n2, l2,r2); return 0; }เอาต์พุต
Maximum Cost for First Example:11 Maximum Cost for Second Example:19