1 solutions

  • 0
    @ 2024-9-29 19:59:06

    先考虑一只鞋子的情况,就是求序列的最大子段和,一双鞋子即为,序列中最大的两段子段和。

    • fif_i 表示 以 ii 为结尾 的 最大子段和
    • preipre_i 表示 1i1- i 中的最大子段和
    • gig_i 表示 以 ii 为开头 的 最大子段和
    • sufisuf_i表示 ini - n 中的最大子段和
    fi=max(fi1+ai,ai)f_i=\max(f_{i-1}+ a_i , a_i ) prei=max(prei1,fi)pre_i=\max(pre_{i-1},f_i)

    g,sufg,suf 同理 答案为 prei+sufi+1pre_i + suf_{i+1}

    #include <bits/stdc++.h>
    #define int long long
    using namespace std;
    int n,c,a[1000005],g1[1000005],g2[1000005],f1[1000005],f2[1000005],ans=-1e9+7;
    signed main() {
    	cin>>n;
    	g1[0]=g2[n+1]=-1e18;
    	for(int i=1; i<=n; i++)cin>>a[i];
    	for(int i=1; i<=n; i++) f1[i]=max(f1[i-1]+a[i],a[i]);
    	for(int i=1;i<=n;i++) g1[i]=max(g1[i-1],f1[i]);
    	for(int i=n;i>=1;i--) f2[i]=max(f2[i+1]+a[i],a[i]);
    	for(int i=n;i>=1;i--) g2[i]=max(g2[i+1],f2[i]);
    	for(int i=0;i<=n;i++)ans=max(g1[i]+g2[i+1],ans);
    	if(ans<=0)cout<<"no solution"<<endl;
    	else cout<<ans<<endl;
    	return 0;
    }
    
    • 1

    Information

    ID
    521
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    8
    Tags
    (None)
    # Submissions
    93
    Accepted
    13
    Uploaded By