給你乙個序列,讓你在其中找一段連續的子串行,使得這個連續的子串行的和是最大的。
它實際上有點動態規劃的意思在裡面,設f[i]表示以第i個數字作為結尾的連續子串行的和的最大可能值。
則 \(f[i] = max(f[i-1]+a[i],a[i])\), 這裡的 \(f[i-1]+a[i]\) 實際上表示的就是,讓a[i]和以a[i-1]結尾的對應的最大連續和接上去。
形成以a[i]結尾的連續和,但是還有一種情況就是a[i]選擇自己和自己玩。即a[i]自己作為獨立的乙個序列。
這兩種情況選擇較優的那種,作為f[i]的值,最後遍歷一遍f[i],找到最大值即可。
但是我們還能做得更多一些,會發現,如果f[i-1]是個負數的話,那麼再怎麼樣肯定也是讓a[i]獨立作為乙個序列更優的。
對應的,如果f[i-1]為正數的話,加上a[i]肯定更優。
因此,我們可以只需定義乙個變數cur,表示以a[i-1]為結尾的連續子串行的最大和(也即我們上面分析的f[i-1]),只要cur
變為負數了,就將其值賦值為0(正數就讓它繼續累加),然後我們只要遍歷一遍整個陣列,cur累加a[i]的值,然後取 \(max(cur)\) 即可。
#include#define ll long long
#define rei(x) scanf("%d",&x)
#define rel(x) scanf("%i64d",&x)
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
using namespace std;
const int n = 1e6;
int n;
ll a[n+10];
int main()
cout
}
最大連續子段和
最大連續子段和 給定長度為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個整數的和,最大連續子段和...
HDU 1231 最大連續子串行(最大連續子段和)
description 求最大連續子段和,並輸出此字段的起始位置和終止位置的值 input 多組用例,每組用例第一行為序列長度n,第二行n個整數表示該序列,以n 0結束輸入 output 對每個測試用例,輸出最大連續子段和及其起始位置和終止位置的值,如果序列全為負值則令最大連續子段和為0,而起止位置...