1. 程式人生 > >允許交換兩個數(一對)的位置 求最大子陣列和

允許交換兩個數(一對)的位置 求最大子陣列和

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

相關推薦

允許交換個數(一對)的位置 大子陣列

#include <iostream> #include <vector> using namespace std; int findMaxSubquenceSum(vect

線性時間內大子陣列

    給定KK個整陣列成的序列{ N_1N​1​​, N_2N​2​​, ..., N_KN​K​​ },“連續子列”被定義為{ N_iN​i​​, N_{i+1}N​i+1​​, ..., N_jN​j​​ },其中 1 \le i \le j \le K1≤i≤

陣列個數異或大值

特別說明:本文轉載自lingen1949 大神的文章,按照個人理解增加了部分註釋,感謝大神提供思路。在此附上原文連結: 題目要求: Given a non-empty array of numbers, a0, a1, a2, … , an-1, where

輸入個數,輸出其大公約數小公倍數,並輸出所有的公約數

輸入兩個數,求其最大公約數和最小公倍數,並輸出所有的公約數 以下分別用三種方法求最大公約數,詳細程式碼如下: #include <iostream> using namespace std; //求最大公約數:求差法 void div1(int m,int n){ i

大子陣列,以及大子陣列的起始位置末尾位置

int MaxSubArraySum(int a[], int N, int &start, int &end) { int ThisSum, MaxSum, i, j; *start = 0; *end = 0; MaxSum = 0; for (i = 0; i < N;

HDU acm 1003 Max Sum || 動態規劃大子序列詳解

line namespace num more sequence mem ould 動態規劃 ger Max Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Ot

數據結構(一)-----4種方法大子

include iss 需要 中間 () log 完整 font sso 數據結構(一)-----4種方法求最大子列和 1、暴力算法 /* 作者:mys 功能:求最大子列和 日期:2018/7/23 */ #include<stdio.h> #include&l

[C++]用三種方法大子

規劃 amp pan 分治 一位 max 組成 所有 ret 問題描述:給定n個整數組成的序列,求其中子段和的最大值。當所有整數均為非負整數時定義其最大子段和為0 方法一:O(n2)用一個值存儲最大和,用枚舉所有和的方法,來與這個值比較並更新最大值。 1 int

大子

int MaxSubSeqSum(int arr[], int n) { int currentSum, maxSum; currentSum = maxSum = 0; for(int i=0; i<n; i++) { curr

一個已知二維陣列大子陣列(司宇,廖強)

小組成員:司宇,廖強 設計流程:            設計介面:               程式設計:1.封裝一個求二維整陣列最大子陣列和的子程式;  

[LeetCode] 628. Maximum Product of Three Numbers 三個數字的大乘積 [LeetCode] 152. Maximum Product Subarray 大子陣列乘積 All LeetCode Questions List 題目彙總

Given an integer array, find three numbers whose product is maximum and output the maximum product. Example 1: Input: [1,2,3] Output: 6  Example 2

如何大子陣列

問題描述:一個有n個元素的陣列,這n個元素可以是正數也可以是負數,陣列中連續的一個或多個元素可以組建成一個連續的子陣列,一個數組可以有多個這樣的連續子陣列,求子陣列和的最大值,並找出最大的子陣列,例如,對於陣列{1,-2,4,8,-4,7,-1,-5},其最大和的子陣列是{4,8,-4,7}

分治演算法-java大子陣列問題

今天看演算法導論的時候,就想著動紙和筆來思考分治演算法求最大子陣列的方案 首先我們分析問題,我們把陣列看成 a [ low, high] ,將要用分治法求出其最大的子陣列,用分治法相當於我們要把陣列分成兩個規模儘量相等的子陣列 (因為有時候陣列長度是奇數,無法區分),找到陣列的中間位置mid,這樣

分治策略,大子陣列golang實現

package main import ( "fmt" ) func main() { a := []int{9, 6, -7, 1, 8, -20, 5, 3, 4, 0, 2} l, r, s := FindMaxSubArray(a, 0, 10)

聯機演算法——大子

給定一個整數陣列 nums ,找到一個具有最大和的連續子陣列(子陣列最少包含一個元素),返回其最大和。 示例: 輸入: [-2,1,-3,4,-1,2,1,-5,4], 輸出: 6 解釋: 連續子陣列 [4,-1,2,1] 的和最大,為 6。 聯機演算法:聯機演算法是在

[LeetCode] Maximum Product Subarray 大子陣列乘積

Find the contiguous subarray within an array (containing at least one number) which has the largest product. For example, given the array [2,3,-2,4],the

leetcode 53 Maximum Subarray (大子陣列

題目要求 (高頻題) 給定一個整數陣列nums,找到具有最大和的連續子陣列(包含至少一個數字)並返回其和。 示例 Input: [-2,1,-3,4,-1,2,1,-5,4], Output: 6 Explanation: [4,-1,2,1] has the large

【演算法導論】大子陣列

要求:找到陣列中連續和最大的子陣列 來源:演算法導論,第四章 方法:分治法 思路:一個串中和最大的子陣列,可能出現的位置1、前一半(不包含中間元素)                                                               

一個已知陣列大子陣列

思路: 用textbox控制元件輸入陣列,再求出最大子陣列和 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing

演算法設計與分析--大子問題(蠻力法、分治法、動態規劃法) C++實現

演算法設計與分析--求最大子段和問題 問題描述: 給定由n個整陣列成的序列(a1,a2, …,an),求該序列形如 的子段和的最大值,當所有整數均為負整數時,其最大子段和為0。 利用蠻力法求解: int maxSum(int a[],int n) { int ma