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; } 
- 1
 
信息
- ID
 - 3308
 - 时间
 - 1000ms
 - 内存
 - 256MiB
 - 难度
 - 6
 - 标签
 - (无)
 - 递交数
 - 58
 - 已通过
 - 18
 - 上传者