最大子列和的四種演算法比較
本文將會介紹最大子列和的四種不同複雜度演算法。
演算法一:暴力列舉法,演算法複雜度為O(N三次方)
int maxsequence1(int A[], int N)
{
int ThisSum , MaxSum=0;
int i, j, k;
for (i = 0; i <= N; i++) {
for (j = i; j <= N; j++) {
ThisSum = 0;
for (k = i; k <= j; k++)
ThisSum += A[k];
if (ThisSum > MaxSum)
MaxSum = ThisSum;
}
}
return MaxSum;
}
演算法二:演算法一的改進,減少一個for迴圈,複雜度為O(N平方)
int maxsequence2(int A[], int N)
{
int ThisSum, MaxSum = 0;
int i, j;
for (i = 0; i <= N; i++) {
ThisSum = 0;
for (j = i; j <= N; j++) {
ThisSum += A[j];
if (ThisSum > MaxSum)
MaxSum = ThisSum;
}
}
return MaxSum;
}
演算法三:分而治之。演算法複雜度為O(NlogN)
int Max(int A, int B, int C)
{
/*return A > B ? A > C ? A :C: B > C ? B : C;*/
if (A > B) {
if (A > C)
return A;
else
return C;
}
else if (B > C)
return B;
else return C;
}
int DivideAndConquer(int List[], int left, int right) {
int MaxLeftSum, MaxRightSum;
int MaxLeftBoardSum, MaxRightBoardSum;
int LeftBoardSum, RightBoardSum;
int center,i;
/*遞迴終止條件*/
if (left == right) {
if (List[left] > 0)
return List[left];
else
return 0;
}
center = (right + left) / 2;
MaxLeftSum = DivideAndConquer(List, left, center);
MaxRightSum= DivideAndConquer(List, center+1, right);
MaxLeftBoardSum = 0; LeftBoardSum = 0;
for (i = center;i >= left; i--)
LeftBoardSum += List[i];
if (LeftBoardSum > MaxLeftBoardSum)
MaxLeftBoardSum = LeftBoardSum;
MaxRightBoardSum = 0; RightBoardSum = 0;
for (i = center + 1; i <= right; i++)
RightBoardSum += List[i];
if (RightBoardSum > MaxRightBoardSum)
MaxRightBoardSum = RightBoardSum;
return Max(MaxLeftSum, MaxRightSum, MaxRightBoardSum + MaxLeftBoardSum);
}
int maxsequence3(int A[], int N)
{
return DivideAndConquer(A, 0, N-1);
}
演算法四:線上處理演算法,程式碼最簡單,且複雜度最低,為O(N)
int maxsequence4(int A[], int N)
{
int ThisSum,MaxSum ;
int i;
ThisSum = MaxSum = 0;
for (i = 0; i <= N; i++) {
ThisSum += A[i];
if (ThisSum > MaxSum)
MaxSum = ThisSum;
else if (ThisSum < 0)
ThisSum = 0;
}
return MaxSum;
}
主程式如下
#include <stdio.h>
int maxsequence1(int A[], int N);
int maxsequence2(int A[], int N);
int maxsequence3(int A[], int N);
int maxsequence4(int A[], int N);
int main(void)
{
int K,j=0;
int a,max;
int num[100000];
printf("請輸入數字個數:\n");
scanf("%d", &K);
printf("請輸入%d個數字\n", K);
for (a = 0; a < K; a++) {
scanf("%d", &num[a]);
if (num[a] < 0)
j++;
}
if (j == K)
printf("0\n");
else {
/*用哪個選哪個*/
max = maxsequence1(num, K);
max = maxsequence2(num, K);
max = maxsequence3(num, K);
max = maxsequence4(num, K);
printf("最大子列和為:%d\n", max);
}
}
以上即為求最大子列和的四種演算法。
相關推薦
最大子段和四種求法
給定n(1<=n<=100000)個整數(可能為負數)組成的序列a[1],a[2],a[3],…,a[n],求該序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。當所給的整數均為負數時定義子段和為0,依此定義,所求的最優值為: Max{0,a[i]+a
最大子列和的四種演算法比較
本文將會介紹最大子列和的四種不同複雜度演算法。 演算法一:暴力列舉法,演算法複雜度為O(N三次方) int maxsequence1(int A[], int N) { int ThisSum , MaxSum=0; int i, j,
最大子列和的四種演算法總結
最大子列和問題描述: 給定一串整數列中,求滿足子列和最大,並返回最大值。例如(2, -1, 6, 8, -5, 7, -11),其中的滿足和最大的子列為(2, -1, 6, 8, -5, 7),最大值為17。 演算法一 最蠢的方法是列舉法,把所有的子列都跑
數據結構(一)-----4種方法求最大子列和
include iss 需要 中間 () log 完整 font sso 數據結構(一)-----4種方法求最大子列和 1、暴力算法 /* 作者:mys 功能:求最大子列和 日期:2018/7/23 */ #include<stdio.h> #include&l
演算法學習——最大子列和問題
參考視訊: 中國大學mooc——浙江大學——資料結構——陳越、何欽銘 問題描述: 求取陣列中最大連續子序列和,例如給定陣列為A={1, 3, -2, 4, -5}, 則最大連續子序列和為6,即1+3+(-2)+ 4 = 6。 演算法一 int MaxSubseqSu
最大子列和問題3種解法C語言
演算法1 找出所有的子列和,返回最大的 int MaxSubseqSum1(int str[],int n) //時間複雜度為O(n*2) { int maxsum=0; for(int i=0;i<n;i++){ int sum=0; for(int j=i;j
線上處理演算法 | HDU 1003 Max Sum 最大子列和
Max Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 299181 Accepted Submission(s)
PTA資料結構與演算法題目集(中文)5-1 最大子列和問題 (20分)
給定KK個整陣列成的序列{ N_1N1, N_2N2, ..., N_KNK },“連續子列”被定義為{ N_iNi, N_{i+1}Ni+1, ..., N_jNj },其中 1 \le i \le j \le K1≤i≤j≤
PTA 資料結構題目(1):最大子列和問題(分而治之、線上處理演算法)
題目來源: 問題描述: 問題分析: 對於一般的問題,原始解 都能通過一種 蠻力演算法,即窮舉法的思想得到。這題也不例外。 如果我們,把輸入的陣列,所有的子列都歷遍,並從中找出最大,即可得出我們的演算法。也就是版本一。 學習要點: 1、如何
演算法筆記-1-最大子列和-Maximum Subsequence Sum
題目內容: Given a sequence of KK integers {N1,N2,...,NK}. A continuous subsequence is defined to be {Ni,Ni+1,...,Nj} where 1≤i≤j≤K1
應用實例——最大子列和問題
[] str else -s 給定 復雜 lin wid 工作流 題目描述:給定N個整數的序列{A1,A2,...,AN},求函數f(i,j)=max{0,ΣAk(i<=k<=j)}的最大值 算法1: 1 int MaxSubseqSum1(int A[],
最大子列和(在線處理,復雜度O(n))
spa 最大子列和 pts 最大 int nts ups script 程序 #include<stdio.h> int main(){ int k,num,sum=0,Max=0; scanf("%d",&k); while(k--){ s
資料結構之最大子列和
#include <stdlib.h> #include <stdio.h> int MaxSubseqSum(int a[],int N) { int i,ThisSum = 0,MaxSum = 0; &nb
PATtest1.3:最大子列和
題目源於:https://pintia.cn/problem-sets/16/problems/663 題目要求:輸入一個數列,求其最大子列和。 問題反饋:1.部分C++程式碼不是很熟練 &
求最大子列和
int MaxSubSeqSum(int arr[], int n) { int currentSum, maxSum; currentSum = maxSum = 0; for(int i=0; i<n; i++) { curr
最大子列和 – 線上處理
#最大子列和 – 線上處理 01-複雜度2 Maximum Subsequence Sum (25 分) The Maximum Subsequence is the continuous subsequence which has the largest sum of its elem
基礎數據結構應用——最大子列和問題
pan nts -h 不同 ... printf fine () script 給定K個整數組成的序列{ N?1??, N?2??, ..., N?K?? },“連續子列”被定義為{ N?i??, N?i+1??, ..., N?j?? },其中 1。“最大子列和”則被定義
hdu1003Maxsum(最大子列和問題)
這道題開始一直是Time Limit Exceeded,後來改動了又Wrong Answer,然後就是Presentation Error,改著改著終於AC了 題目連結:hdu1003 這是一道動態規劃的題目,即求最大子序列和:給定一列數a[1],a[2].....a[n],求a[i]+..
7-1 最大子列和問題 (20 分)
給定K個整陣列成的序列{ N1, N2, …, NK },“連續子列”被定義為{ Ni, Ni+1, …, Nj },其中 1≤i≤j≤K。“最大子列和”則被定義為所有連續子列元素的和中最大者。例如給定序列{ -2, 11,
最大子列和(時間複雜度)程式碼實現及結果對比
題目:給定N個整數的序列{A1,A2,A3...ANA_1,A_2,A_3...A_NA1,A2,A3...AN}, 求函式f(i,j)=max(0,Σk=1jAk)f(i,j)=max(0,\Sigma_{k=1}^jA_k)f(i,j)=max(0,