zoukankan      html  css  js  c++  java
  • poj2479(dp)

    题目链接:http://poj.org/problem?id=2479

    题意:求所给数列中元素值和最大的两段子数列之和。

    分析:从左往右扫一遍,b[i]表示前i个数的最大子数列之和。

            从右往左扫一遍,c[i]表示后i个数的最大子数列之和。

            ans=max(ans,b[i]+c[i+1])0<i<n

            dp方程为 sum=max(sum+a[i],a[i])

                         dp[i]=max(dp[i-1],sum)

    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <iostream>
    #include <algorithm>
    #include <queue>
    #include <cstdlib>
    #include <vector>
    #include <set>
    #include <map>
    #define LL long long
    #define mod 1000000007
    #define inf 0x3f3f3f3f
    #define N 50010
    using namespace std;
    int a[N],b[N],c[N];
    int main()
    {
        int t,n;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d",&n);
            for(int i=1;i<=n;i++)scanf("%d",&a[i]);
            int sum=a[1];
            b[1]=a[1];
            for(int i=2;i<=n;i++)
            {
                sum=max(sum+a[i],a[i]);
                b[i]=max(sum,b[i-1]);
            }
            sum=a[n];c[n]=a[n];
            for(int i=n-1;i>=1;i--)
            {
                sum=max(sum+a[i],a[i]);
                c[i]=max(sum,c[i+1]);
    
            }
            int ans=-inf;
            for(int i=1;i<n;i++)
            {
                ans=max(b[i]+c[i+1],ans);
            }
            printf("%d
    ",ans);
        }
    }
    View Code
  • 相关阅读:
    hide the navigationBar and tabBar
    js
    CATranstion动画
    CASpringAnimation
    UIImageView动画
    打电话发短信
    页面滑动悬停在某个控件(两种做法)
    导航栏相关设置
    ASCII和16进制
    C++中,申请字符串数组可用new实现
  • 原文地址:https://www.cnblogs.com/lienus/p/4160718.html
Copyright © 2011-2022 走看看