Khái niệm
Đối với một mảng A đã cho có N phần tử và hai số nguyên l và r trong đó, 1≤ a x ≤ 10 5 và 1≤ l≤ r≤ N. Chúng ta có thể chọn bất kỳ phần tử nào của mảng (giả sử là ax) và xóa nó, đồng thời xóa tất cả các phần tử bằng a x +1, một x +2… a x + R và a x -1, một x -2… a x -L từ mảng. Bước này sẽ tốn điểm ax. Nhiệm vụ của chúng tôi là tối đa hóa tổng chi phí sau khi xóa tất cả các phần tử khỏi mảng.
Đầu vào
2 1 2 3 2 2 1 l = 1, r = 1
Đầu ra
8
Ở đây, chúng tôi chọn 2 để xóa, sau đó (2-1) =1 và (2 + 1) =3 sẽ cần được xóa, cho khoảng l và r tương ứng.
Lặp lại điều này cho đến khi loại bỏ hoàn toàn 2. Vì vậy, tổng chi phí =2 * 4 =8.
Đầu vào
2 4 2 10 5 l = 1, r = 2
Đầu ra
18
Ở đây, chúng tôi chọn 2 để xóa, sau đó là 5 và sau đó là 10.
Vậy tổng chi phí =2 * 2 + 5 + 10 =19.
Phương pháp
Bây giờ, chúng ta sẽ xác định số lượng của tất cả các phần tử. Giả sử một phần tử X được chọn sau đó, các alen trong phạm vi [X-l, X + r] sẽ bị xóa. Hiện tại, chúng tôi chọn phạm vi tối thiểu từ vùng đất r và xác định các phần tử nào sẽ bị xóa khi phần tử X được chọn. Kết quả sẽ là tối đa của các phần tử đã xóa trước đó và khi phần tử X bị xóa. Bây giờ, chúng tôi sẽ thực hiện lập trình động để lưu trữ kết quả của các phần tử đã xóa trước đó và triển khai thêm.
Ví dụ
// C++ program to find maximum cost after // deleting all the elements form the array #include <bits/stdc++.h> using namespace std; // Shows function to return maximum cost obtained int maxCost(int a[], int m, int L, int R){ int mx1 = 0, k1; // Determine maximum element of the array. for (int p = 0; p < m; ++p) mx1 = max(mx1, a[p]); // Used to initialize count of all elements to zero. int count1[mx1 + 1]; memset(count1, 0, sizeof(count1)); // Compute frequency of all elements of array. for (int p = 0; p < m; p++) count1[a[p]]++; // Used to store cost of deleted elements. int res1[mx1 + 1]; res1[0] = 0; // Choosing minimum range from L and R. L = min(L, R); for (int num1 = 1; num1 <= mx1; num1++) { // Determines upto which elements are to be // deleted when element num is selected. k1 = max(num1 - L - 1, 0); // Obtain maximum when selecting element num or not. res1[num1] = max(res1[num1 - 1], num1 * count1[num1] + res1[k1]); } return res1[mx1]; } // Driver program 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; // size of array int n1 = sizeof(a1) / sizeof(a1[0]); int n2 = sizeof(a2) / sizeof(a2[0]); // function call to find maximum cost 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; }
Đầu ra
Maximum Cost for First Example:11 Maximum Cost for Second Example:19