在这个问题中,我们得到了大小为n且数字为k的数组arr []。我们的任务是创建一个程序,以找到至少k个遥远元素的最大和子序列。
问题描述-我们需要找到子数组的总和,以使子数组的元素从索引为k距离且总和最大的数组中获取。
让我们举个例子来了解这个问题,
arr[] = {2, 3, 7, 9, 2, 8, 3}
输出结果
15
All subsequences that satisfy the given condition, {2, 9, 3}, Sum = 14 {3, 2}, Sum = 5 {7, 8}, Sum = 15
解决该问题的简单方法是找到满足给定条件的所有可能的子阵列。找到所有数组的总和并返回所有的最大值。
解决该问题的更有效方法是使用动态编程方法,方法是创建一个数组以存储最大和直到当前元素。对于当前元素,我们可以将其视为总和,也可以将其舍弃为总和,以增加总和直至当前索引为准。
如果我们将其作为总和,sum [i] = sum [i + k + 1] + arr [i + 1]否则将其丢弃,以sum [i] = sum [i + 1]返回总和为sum [0]。
该程序说明了我们解决方案的工作原理,
#include <bits/stdc++.h> using namespace std; int calcMaxSubSeqSum(int arr[], int N, int k){ int maxSumDP[N]; maxSumDP[N − 1] = arr[N − 1]; for (int i = N − 2; i >= 0; i−−) { if (i + k + 1 >= N) maxSumDP[i] = max(arr[i], maxSumDP[i + 1]); else maxSumDP[i] = max(arr[i] + maxSumDP[i + k + 1], maxSumDP[i + 1]); } return maxSumDP[0]; } int main() { int N = 10, k = 2; int arr[] = { 50, 70, 40, 50, 90, 70, 60, 40, 70, 50 }; cout<<"The maximum sum subsequence with at−least k distant elements is "<<calcMaxSubSeqSum(arr, N, k); return 0; }
输出结果
The maximum sum subsequence with at-least k distant elements is 230