3 条题解

  • 2
    @ 2022-12-27 12:07:18

    动态规划即可

    #include <bits/stdc++.h>
    #define R register
    using namespace std;
    inline void in(int &x)
    {
    	int f=1;x=0;char s=getchar();
    	while(!isdigit(s)){if(s=='-')f=-1;s=getchar();}
    	while(isdigit(s)){x=x*10+s-'0';s=getchar();}
    	x*=f;
    }
    int n,ans=-2147483644;
    int l[1000008],r[1000008],x[1000008];
    int main()
    {
    	in(n);
    	for(R int i=1;i<=n;i++)in(x[i]);
    	l[1]=x[1];
    	for(R int i=2;i<=n;i++)
    		l[i]=max(l[i-1]+x[i],x[i]);
    	for(R int i=2;i<=n;i++)
    		l[i]=max(l[i-1],l[i]);
    	r[n]=x[n];
    	for(R int i=n-1;i>=1;i--)
    		r[i]=max(r[i+1]+x[i],x[i]);
    	for(R int i=n-1;i>=1;i--)
    		r[i]=max(r[i+1],r[i]);
    	for(R int i=2;i<n;i++)
    		ans=max(ans,r[i+1]+l[i-1]);
    	cout << ans;
        return 0;
    }//已AC
    
    • 1
      @ 2022-7-13 17:14:51

      这个题好像跟第一天一样,虽然花了半个小时 暴力过不去了 这类题思路基本统一只不过加了一个两端 记住模型以后这种题必须AC

      #include <bits/stdc++.h>
      using namespace std;
      long long n,f1[1000005],f2[1000005],a[1000005],ans = -1e15,p[1000005],q[1000005];
      int main()
      {
      	cin >> n;
      	for(int i=1; i<= n ;i++)
      	{
      		cin >> a[i];
      	}	
          f2[n+1]= f1[0] = -1e15;
      	for(int i=1; i<= n ;i++)
      	{
      		f1[i] = max(a[i],f1[i-1]+a[i]);//f1[i] 表示从前开始,以i为结尾,子段的最大值
      		p[i] = max(f1[i],p[i-1]);//p[i] 表示从前开始,以i为结尾,所有f[j]  1<=j <= i 的最大值。(p f1这俩不一样)
      	}
      	for(int i=n; i>= 1 ;i--)
      	{
      		f2[i] = max(a[i],f2[i+1]+a[i]);
      		q[i] = max(f2[i],q[i-1]);//f2[i] 和 q[i] 同理,聪明如你一定能明白
      	}
      	for(int i=2; i <= n-1; i++)
      	{
      		ans = max(p[i-1]+q[i+1],ans);//中间至少空一个
      	}
      	cout << ans;
      	return 0;
      }
      
      • 0
        @ 2022-8-1 21:50:09

        这是L几讲的内容,完全忘了

        这题都能和老师对线一个多小时,醉了

        类似最长上升子序列 滚去复习了ww

        完整代码

        #include<bits/stdc++.h>
        using namespace std;
        long long n , a[ 1000001 ] , f1[ 1000001 ] , f2[ 1000001 ] , ans = 0xc0c0c0c0c0c0c0c0;
        int main()
        {
            ios::sync_with_stdio( 0 ) ;
            cin.tie( 0 ) ;
            cin >> n ;
            for( long long i = 1 ; i <= n ; i ++ ) cin >> a[ i ] ;
            f1[ 1 ] = a[ 1 ] ;
            for( long long i = 2 ; i <= n ; i ++ )
            {
                f1[ i ] = max( a[ i ] + f1[ i - 1 ] , a[ i ] ) ;
            }
            for( long long i = 2 ; i <= n ; i ++ )
            {
                f1[ i ] = max( f1[ i - 1 ] , f1[ i ] ) ;
            }
            f2[ n ] = a[ n ] ;
            for( long long i = n - 1 ; i >= 1 ; i --)
            {
                f2[ i ] = max( a[ i ] + f2[ i + 1 ] , a[ i ] ) ;
            }
            for( long long i = n - 1 ; i >= 1 ; i -- )
            {
                f2[ i ] = max( f2[ i + 1 ] , f2[ i ] ) ;
            }
            for( long long i = 2 ; i <= n - 1 ; i ++ )
            {
                ans=  max( ans , f1[ i - 1 ] + f2[ i + 1 ] ) ;
            }
            cout << ans ;
            return 0; 
        }
        
      • 1

      信息

      ID
      1901
      时间
      1000ms
      内存
      256MiB
      难度
      4
      标签
      递交数
      118
      已通过
      57
      上传者