1 条题解
-
0
DP
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 2e5+5; int n; ll w[maxn],sum[maxn],mx[maxn]; ll dp[maxn]; //最大连续子序列和 int main() { cin>>n; for(int i=1;i<=n;i++) { cin>>w[i]; sum[i] = sum[i-1] + w[i]; mx[i] = max(mx[i-1],sum[i]); //预处理防超时 } for(int i=1;i<=n;i++) { if(dp[i-1] > 0) dp[i] = dp[i-1] + w[i]; else dp[i] = w[i]; } ll ans = dp[1]; for(int i=2;i<=n;i++) { ans = max(ans,dp[i]); } //以上为正常(没有环)的结果 for(int i=1;i<=n;i++) //判断从n到1的特殊情况 { int r = i-1; ll circle1 = sum[n] - sum[i-1]; ans = max(ans,circle1+mx[r]); //一个环是否更优 //mx[r]是从1到i-1中的最大值,circle1是从i到n,两者结合构成一个环 } cout<<ans; return 0; }
信息
- ID
- 3308
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 6
- 标签
- (无)
- 递交数
- 58
- 已通过
- 18
- 上传者