允许交换两个数(一对)的位置 求最大子数组和

来源:互联网 发布:mac. wps 编辑:程序博客网 时间:2024/04/28 23:40
#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));}

0 1
原创粉丝点击