允許交換兩個數(一對)的位置 求最大子陣列和
#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_1N1, N_2N2, ..., N_KNK },“連續子列”被定義為{ N_iNi, N_{i+1}Ni+1, ..., N_jNj },其中 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