zoukankan      html  css  js  c++  java
  • poj 2479 Maximum sum(求最大子段和的延伸)

    题目链接


    题意:

           题目的大概意思是把数组分成不交两段,分别求出两段的最大子段和s1和s2,然后求出最大的s1+s2。不知道最大子段和的点这  here

    思路:

          看完最大连续子段和 的 dp算法 这个很容易理解,我用dplift[i]保存第1到第i个之间的最大子段和,dpright[i]保存第i到第n个之间的最大子段和,最终结果就是dplift[i]+dpright[i+1]中最大的一个。


    代码

    //poj 2479 Maximum sum
    //2013-05-01-17.26
    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    using namespace std;
    const int maxn = 50005;
    int dplift[maxn];
    int dpright[maxn];
    int a[maxn];
    
    int main()
    {
        int t, n;
        scanf("%d", &t);
        while (t--)
        {
            scanf("%d", &n);
            for (int i = 1; i <= n; i++)
            {
                scanf("%d", &a[i]);
            }
    
            dplift[1] = a[1];
            for (int i = 2; i <= n; i++)
            {
                if (dplift[i-1] > 0)
                    dplift[i] = dplift[i-1] + a[i];
                else
                    dplift[i] = a[i];
            }
            for (int i = 2; i <= n; i++)
                dplift[i] = max(dplift[i], dplift[i-1]);
    
            dpright[n] = a[n];
            for (int i = n-1; i >= 1; i--)
            {
                if (dpright[i+1] > 0)
                    dpright[i] = dpright[i+1] + a[i];
                else
                    dpright[i] = a[i];
            }
            for (int i = n-1; i >= 1; i--)
                dpright[i] = max(dpright[i+1], dpright[i]);
    
            int ans = dplift[1] + dpright[2];
            for (int i = 2; i < n; i++)
            {
                ans = max(dplift[i]+dpright[i+1], ans);
            }
            printf("%d\n", ans);
        }
        return 0;
    }
    

  • 相关阅读:
    Apple Watch知识点总结
    segue场景跳转的使用总结
    iOS地图相关知识点总结
    第三方库AFNetwork的作用和用法详解
    UIImagePickerController的知识点总结
    关于图片的压缩问题
    盒子模型知识
    CSS3新增属性
    ps命令详解
    http请求中的Referer的作用
  • 原文地址:https://www.cnblogs.com/xindoo/p/3595140.html
Copyright © 2011-2022 走看看