下面為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 longusing
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。輸...