对于具有N个单元和两个整数L和R,其中,1≤一给定阵列A的X ≤10 5和1≤L≤R≤N.我们可以选择阵列中的任何元件(比方说AX),并删除它,并从数组中删除等于x + 1,a x +2…a x + R和a x -1,a x -2…a x -L的所有元素。此步骤将花费斧头点数。我们的任务是在删除数组中的所有元素后使总成本最大化。
2 1 2 3 2 2 1 l = 1, r = 1
输出结果
8
在这里,我们选择2删除,则分别对于给定的l和r范围,将需要删除(2-1)= 1和(2 + 1)= 3。
重复此过程,直到2被完全删除。因此,总成本= 2 * 4 = 8。
2 4 2 10 5 l = 1, r = 2
输出结果
18
在这里,我们选择2删除,然后选择5再选择10。
因此总成本= 2 * 2 + 5 + 10 = 19。
现在,我们将确定所有元素的数量。假设选择了元素X,则将删除[Xl,X + r]范围内的所有元素。目前,我们从l和r中选择最小范围,并确定选择元素X时要删除的元素。结果将是先前删除的元素以及删除元素X时的最大值。现在,我们将实现动态编程,以存储先前删除的元素的结果并进一步实现。
// C++ program to find maximum cost after //删除数组中的所有元素 #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<<"第一个示例的最高费用:" << maxCost(a1, n1, l1,r1)<<endl; cout<<"第二个示例的最高费用:" << maxCost(a2, n2, l2,r2); return 0; }
输出结果
第一个示例的最高费用:11 第二个示例的最高费用:19