C++ 中模 m 的最大子阵列和
在这个问题中,我们给定了一个大小为 n 的数组和一个整数 m。我们的任务是创建一个程序,在 C++ 中找到模 m 的最大子阵列和。
程序说明 - 在这里,我们将找到最大值,该值是通过将子阵列中所有元素的和除以 m 获得的。
我们通过一个例子来理解这个问题,
输入 - array = {4, 9 ,2} m = 6
输出 - 5
说明 - 所有子阵列及其余数在除以
{4}: 4%6 = 4 {9}: 9%6 = 3 {2}: 2%6 = 2 {4, 9}: 13%6 = 1 {9, 2}: 11%6 = 5 {4, 9, 2}: 15%6 = 3
要解决这个问题,我们计算 prefixSumModulo 数组。并使用公式计算每个索引的最大和,即第 i 处的最大和 = (prefixi + prefixj + m)%m
示例
程序说明我们的解决方案,
#include<bits/stdc++.h> using namespace std; int calcMaxSum(int arr[], int n, int m) { int x, prefix = 0, maxSumMod = 0; set<int> sums; sums.insert(0); for (int i = 0; i < n; i++){ prefix = (prefix + arr[i])%m; maxSumMod = max(maxSumMod, prefix); auto it = sums.lower_bound(prefix+1); if (it != sums.end()) maxSumMod = max(maxSumMod, prefix - (*it) + m ); sums.insert(prefix); } return maxSumMod; } int main() { int arr[] = {4, 9, 2}; int n = sizeof(arr)/sizeof(arr[0]); int m = 5; cout<<"Maximum subarray sum modulo "<<m<<" is "<<calcMaxSum(arr, n, m) < endl; return 0; }
输出
Maximum subarray sum modulo 5 is 4
广告