允许交换两个数(一对)的位置 求最大子数组和
#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)); }
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: laravel中角色与权限的管理
- 下一篇: NSMutableArray替换对象