3862 最大連續子段和 完善程式

2021-10-23 18:23:56 字數 1105 閱讀 5306

給出乙個數列(元素個數不多於100),數列元素均為負整數、正整數、0。請找出數列中的乙個連續子數列,使得這個子數列中包含的所有元素之和最大,在和最大的前提下還要求該子串行包含的元素個數最多,並輸出這個最大和以及該連續子數列中元素的個數。例如數列為4,-5,3,2,4時,輸出9和3;數列為1 2 3 -5 0 7 8時,輸出16和7。

#include

using

namespace std;

int a[

101]

;int n,i,ans,len,tmp,beg;

intmain()

elseif(

______(2

)______&&i-beg>len)

if(tmp+a[i]

______(3

)_____)

else

______(5

)______;

} cout<" "<}

7

1 2 3 -5 0 7 8

16 7

水題一枚,就一簡單dp

可以得出ans和len儲存最大連續子段和及其長度,tmp表示當前統計的子段和,beg為當前在子段和前且不屬於該子段和部分的長度,於是beg應初始化為0

進入迴圈,若當前子段和比原先標記的最大子段和大就更新,因為題目要求在子段和最大的前提下元素盡可能多,所以還要判斷:若當前子段和與原先標記的子段和一樣大則長度更新為最長

然後判斷特殊情況:如果在第i位的當前子段和為負,那麼不難理解放棄當前這段i+1位開始統計比繼續往下加更優,所以接下來要處理拋棄當前子段和為負數的部分,第三空即為<0。此時我們要統計的子段和必然都在i+1~n段,前面的i個元素都要減去,beg更新成i。第五空一開始不知道要幹嘛,後來發現for內沒有更新tmp的操作,只能放在第五空了

#include

using

namespace std;

int n,ans,len,tmp,beg,a[

101]

;int

main()

printf

("%d %d\n"

,ans,len)

;}

最大連續子段和

最大連續子段和 給定長度為n的整數序列,a 1.n 求 1,n 某個子區間 i,j 使得a i a j 和最大,或者求出最大的這個和。例如 2,11,4,13,5,2 的最大子段和為20,所求子區間為 2,4 窮舉法 3次for迴圈 第1次for迴圈,遍歷陣列所有數字,即確定子段和的首個數字 第2次...

DP 最大連續子段和

最大連續子段和 hdu 1003 1.問題描述 給定一串整數,例如 6 1 5 4 7,求最大連續子段和?2.演算法介紹 此題不能暴力,o n 2 的時間複雜度必然超時。考慮如下演算法 設mi表示前i個整數包含第i個整數的最大連續子段和。sum i,j 表示第i個整數到第j個整數的和,最大連續子段和...

總結 最大連續子段和

給你乙個序列,讓你在其中找一段連續的子串行,使得這個連續的子串行的和是最大的。它實際上有點動態規劃的意思在裡面,設f i 表示以第i個數字作為結尾的連續子串行的和的最大可能值。則 f i max f i 1 a i a i 這裡的 f i 1 a i 實際上表示的就是,讓a i 和以a i 1 結尾...