關於子串行最大和的幾種演算法

2021-06-27 19:02:44 字數 1008 閱讀 7249

所謂最大子列和,就是給出乙個序列,找到其中一段連續的子串行,並且該子串行的和最大。

如序列:2 3 1 -5 5 -3 3

顯然該序列子串行 2 3 1 有最大和 6

今天,說三種方法來求解此問題。

一,最笨的一種方法

#include

int main(void)

if(s>max)

max=s;}}

printf("%d\n",max);

return 0;

}之所以說是最笨的方法,是因為該程式用的是三重迴圈,時間複雜度是o(n3)

第二種方法

#include

int main(void)

}printf("%d\n",max);

return 0;

}該方法是上一種方法的改進版本,由上一種方法的先求出區間,再進行累加,改為直接的逐個累加,因此可以少乙個迴圈,時間複雜度降低至o(n2)

第三種方法

#include

int main(void)

printf("%d\n",max);

return 0;

}該演算法不僅**量少,而且時間複雜度降低到了o(n),對於該演算法(特別是if(s<0) s=0; ),應該怎麼理解呢?

給定乙個序列:

-1 3 2 -7 5 3 -1

開始執行語句1 得s=-1;不符合語句二,所以直接執行語句3 s=0;

接著 執行1 s=3;max=3;

接著 執行1 s=3+2=5; max=5;

接著 執行1 s=5+(-7)=-2; 因為s<0;所以 執行3,s=0;(語句3的作用就是,當s<0的時候,如果向後加,對於整體的序列,和肯定是減小的,所以索性把前面的序列都捨去,等於另外開闢乙個新的序列),此時的max儲存的還是最大值,max=5;

接下來跟上面就一樣啦 可以理解成求最後三個數構成的子串行的最大和 最大和是5+3=8;

所以 最後max=8

除此之外 還有乙個分治法,也可以求解此問題!

連續子串行最大和

這道題目使用最大和問題的分治演算法 package com.divide.cc author sunnyboy runtime is o nlogn public class sumsequence int maxsum maxsubsequencesum a system.out.println ...

獲得最大和的子串行

如果子串行都是正數,那麼該子串行一定是最大和得子串行的一部分。如果下乙個數為負數,那麼需要判斷該負數和當前子串行的和是否未正。如果是負數,那麼我們可以認為包含這個負數的子串行一定不是最大子串行。但是如果為正數,我們還需要繼續判斷後續節點是否可以使得最大和增加。例如1,2,2,4顯然1,2,2,4為最...

不相鄰子串行最大和

include include using namespace std int msnae vector nums int incl nums 0 incl表示當可以包含nums i 時,前i個元素所能達到的最大值 初始化為第乙個元素 int excl 0 excl表示不包含第nums i 時,前i...