給定有n個整數(可能為負整數)組成的序列a1,a2,…,an,求該序列連續的子段和的最大值。如果該序列的所有元素都是負整數時定義其最大子段和為0。例如,當(a1,a2,a3,a4,a5)=(-5,11,-4,13,-4-2)時,最大子段和為11+(-4)+13=20。
第一行整數個數n,第二行為n個整數,每個整數之間用一空格隔開。
輸出一行,為最大連續子段和。
6 -5 11 -4 13 -4 -2
1<=n<=100000
n個整數的範圍為-1000到1000
這麼高大上的名字解法竟然這樣簡單我也是醉了。
很簡單,不斷相加即可,需要兩個值,乙個sum_max記錄當前的最優解(即最大連續子段和),還有乙個tmp為乙個臨時變數。
思路很簡單,額…好像根本不需要什麼狀態轉移方程。
不斷地累加,(tmp+=a[i])如果tmp的值<=0則要麼第乙個數為負數顯然不要,要麼前面負數的和已經大於正數的和了,那麼前面的數已經沒有選擇的意義了(很好理解,試試就知道了)。
答案就是sum_max;
舉個例子:
-5 2 4 -7 12 6
tmp=-5 < 0 ->tmp=0;sum不更新
tmp=2 > 0 ->tmp=2;sum=2;
tmp=6 > 0 ->tmp=6;sum=6;
tmp=-1 < 0 ->tmp=0;sum=6;
tmp=12 > 0 ->tmp=12;sum=12;
tmp=18 > 0 ->tmp=18;sum=18;
ans=18;
code:
#include
int a[300000];
int main()
int tmp=0,max=-1;
for(int i=1;i<=n;i++)
if(tmp<=0)
}printf("%d\n",max);
return
0;}
最大連續子段和
最大連續子段和 給定長度為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 結尾...