最大子串行和

2021-10-01 17:41:51 字數 1645 閱讀 8126

最大子串行和

給定(可能有負的)整數a1,a2,…,an,求子序列和的最大值。

例如:對於輸入-2,11,-4,13,-5,-2,答案為20(從a2到a4)

法1:窮舉所有的可能

時間複雜度為

o(n^)
public

static

intmaxsubsum1

(int a)

if(s>max)}}

return max;

}

法2:撤銷乙個for迴圈來避免三次的執行時間

時間複雜度為

o(n^)
public

static

intmaxsubsum2

(int a)

}}return max;

}

法3:使用分治法,先分別計算出左半部分、右半部分的最大子串行和,然後計算出跨越中間部分的最大子串行和,求三個中的最大值即可。

時間複雜度為

o(nlogn)
//分治法

public

static

intmaxsubsum3

(int a,

int left,

int right)

int mid=

(right+left)/2

;int l=

maxsubsum3

(a,left,mid)

;//求左半部分的最大子串行和

int r=

maxsubsum3

(a,mid+

1,right)

;//求右半部分的最大子串行和

/*求跨越中間元素的最大子串行和,

左邊的從中間元素向左計算,右邊的從中間元素的下乙個元素向右計算

*/int maxleftbordersum=0;

int leftbordersum=0;

for(

int i=mid;i>=left;i--

)int maxrightbordersum=0;

int rightbordersum=0;

for(

int i=mid+

1;i<=right;i++

)int max_lr=math.

max(l,r)

; max=math.

max(max_lr,maxleftbordersum+maxrightbordersum)

;return max;

法4:動態規劃

令狀態dp[i]表示以a[i]作為末尾的連續序列的最大值

當dp[i-1]>0,dp[i]=dp[i-1]+a[i]

否則,dp[i]=a[i]

所以,dp[i]=max(dp[i-1]+a[i],a[i]);

o(n)
//動態規劃

public

static

intmaxsubsum4

(int a)

return maxsum;

}

和最大子串行

問題描述 第一行輸入乙個正整數n 1 n 100001 第二行輸入n個整數a 0 a 10000 求該組整數子串行最大的和。解決這個問題應該考慮輸入n較大的情況,也就是說,輸入100000個數字判斷它的和最大子串行應當也能很快地算出來。我看過很多求解的 有三重for迴圈的,有兩重for迴圈的,也有使...

最大子串行和

最大子串行是要找出由數組成的一維陣列中和最大的連續子串行。比如的最大子串行就是 它的和是8,達到最大 而 的最大子串行是,它的和是6。找最大子串行的方法很簡單,只要前i項的和還沒有小於0那麼子串行就一直向後擴充套件,否則丟棄之前的子串行開始新的子串行,同時我們要記下各個子串行的和,最後找到和最大的子...

和最大子串行

時間限制 1 sec 記憶體限制 512 mb 提交 3 解決 3 提交 狀態 討論版 對於乙個給定的長度為n的整數序列a,它的 子串行 的定義是 a中非空的一段連續的元素 整數 你要完成的任務是,在所有可能的子串行中,找到乙個子串行,該子串行中所有元素的和是最大的 跟其他所有子串行相比 程式要求你...