最大子段和 洛谷P1115,動態規劃遞推

2022-07-03 16:27:14 字數 1162 閱讀 8933

下面為ac**

#include#define ll long long

using

namespace

std;

const ll maxn=200000+10

;ll a[maxn];

//存放輸入的資料

ll f[maxn];//

用來遞推

intmain()

ll ans=f[1];//

先給ans賦初值為f[i]

for(ll i=2;i<=n;i++)//

這裡的意思是讓ans等於f[1~n]中最大的

if(f[i]>ans)

ans=f[i];

cout

}

點選加號展開**

文字講解(**中也有部分注釋):

f[i]陣列的意義是以a[i]為末尾的序列中最大的總和

比如說序列1 3 4

那麼f[1]=1,f[2]=1+3=4,f[3]=1+3+4=8

然後如果從左往後遞推,也就是f[i],i從1~n

f[i],可以等於a[i],也可以等於f[i-1]+a[i]

這兩個要看誰大,所以要用max函式,具體的遞推方程就是:

比如說當f[i-1]=4,a[i]=-1,那麼f[i]就肯定選和f[i-1]合併比較好

那麼如果f[i-1]=-1,a[i]=4,此時f[i]=a[i]能保證f[i]是以a[i]為末尾的序列中最大的總和

類似的栗子還有好多,可以自己舉栗子看看

接下來推薦一道類似的知識點題目:

再貼一次**

#include#define ll long long

using

namespace

std;

const ll maxn=200000+10

;ll a[maxn];

//存放輸入的資料

ll f[maxn];//

用來遞推

intmain()

ll ans=f[1];//

先給ans賦初值為f[i]

for(ll i=2;i<=n;i++)//

這裡的意思是讓ans等於f[1~n]中最大的

if(f[i]>ans)

ans=f[i];

cout

}

洛谷P1115最大子段和

洛谷1115 最大子段和 題目描述 給出一段序列,選出其中連續且非空的一段使得這段和最大。輸入輸出格式 輸入格式 輸入檔案maxsum1.in的第一行是乙個正整數n,表示了序列的長度。第2行包含n個絕對值不大於10000的整數a i 描述了這段序列。輸出格式 輸入檔案maxsum1.out僅包括1個...

洛谷 P1115 最大子段和

給出一段序列,選出其中連續且非空的一段使得這段和最大。輸入格式 輸入檔案maxsum1.in的第一行是乙個正整數n,表示了序列的長度。第2行包含n個絕對值不大於10000的整數a i 描述了這段序列。輸出格式 輸入檔案maxsum1.out僅包括1個整數,為最大的子段和是多少。子段的最小長度為1。輸...

洛谷P1115 最大子段和

給出一段序列,選出其中連續且非空的一段使得這段和最大。輸入格式 輸入檔案maxsum1.in的第一行是乙個正整數n,表示了序列的長度。第2行包含n個絕對值不大於10000的整數a i 描述了這段序列。輸出格式 輸入檔案maxsum1.out僅包括1個整數,為最大的子段和是多少。子段的最小長度為1。輸...