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

本文介绍了一种求解数组中最大子序列和的问题,并通过动态规划的方法实现了该算法。同时考虑了允许交换数组中两个元素的情况,进一步提高了求解的灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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));
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值