#include <iostream>
#include <vector>
using namespace std;
int findMaxSubquenceSum(vector<int> a) {
int len = a.size();
/*
* prevMaxSum[i-1]表示i前某一元素交换到i上是i前的元素可达到最大值
* 是prevMaxSum[i-1] 不是prevMaxSum[i]
*/
int* prevMaxSum = new int[len];
/*
* backMaxSum[i]表示从i到len-1的元素所能达到的最大值
*/
int* backMaxSum = new int[len];
int curMax = a[0];
prevMaxSum[0] = a[0];
for (int i = 1; i < len; ++i) {
//now记录最大元素
curMax = max(curMax, a[i]);
prevMaxSum[i] = max(curMax, a[i] + prevMaxSum[i - 1]);
}
backMaxSum[len - 1] = a[len - 1];
int result = a[len - 1];
for (int i = len - 2; i >= 0; --i) {
backMaxSum[i] = max(backMaxSum[i + 1], 0) + a[i];
result = max(backMaxSum[i], result);
}
for (int i = 1; i < len; ++i) {
/*
* 当交换元素下标为i时的最大值: backMaxSum[i] - a[i] + prevMaxSum[i - 1]
* 这里是 prevMaxSum[i - 1]和backMaxSum[i] - a[i]注意下标
*/
result = max(backMaxSum[i] - a[i] + prevMaxSum[i - 1], result);
}
return result;
}
/*由前向后交换,所以必须有反序列*/
int findMaxSubquenceSumWithSwap(vector<int> a) {
int result = findMaxSubquenceSum(a);
for (int i = 0, j = a.size() - 1; i < j; ++i, --j) {
swap(a[i], a[j]);
}
return max(result, findMaxSubquenceSum(a));
}
允许交换两个数(一对)的位置 求最大子数组和
最新推荐文章于 2022-03-06 16:35:25 发布