题目大意
题目传送门:ソーシャルゲーム
题目解释:
求给定序列 a a a 的非空最大子段和。
思路分析
很简单,我们用动态规划
算法。
设定
d p [ i ] dp[i] dp[i] 代表第 i i i 个数的最大子段和。
初始化
d p [ i ] dp[i] dp[i] 最开始赋值为 a [ i ] a[i] a[i] 。
状态转移
只要
d
p
[
i
−
1
]
+
a
[
i
]
>
d
p
[
i
]
dp[i-1]+a[i]>dp[i]
dp[i−1]+a[i]>dp[i] ,那么
d
p
[
i
]
=
d
p
[
i
−
1
]
+
a
[
i
]
dp[i]=dp[i-1]+a[i]
dp[i]=dp[i−1]+a[i] 。故状态转移方程式为:
d
p
[
i
]
=
d
p
[
i
−
1
]
+
a
[
i
]
dp[i]=dp[i-1]+a[i]
dp[i]=dp[i−1]+a[i]
代码
直接上代码。
#include<bits/stdc++.h>
using namespace std;
#define cin(x) scanf("%d",&x)
#define cout(x) printf("%d ",x)
#define endl puts("")
int n,dp[(int)2e5+100],a[(int)2e5+100],maxx=-INT_MAX;
signed main(){
cin(n);
for(int i = 1;i<=n;i++){
cin(a[i]);
dp[i]=a[i];//初始化
}
for(int i = 1;i<=n;i++){
dp[i] = max(dp[i],dp[i-1]+a[i]);//记录dp[i]
maxx = max(dp[i],maxx);//记录最大答案
}
cout(maxx);
return 0;
}