1 条题解

  • 0
    @ 2025-9-21 8:43:20

    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
    上传者