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;
    }
    

  • 相关阅读:
    数据结构的入门
    Google 插件
    树莓派的第一次
    MySQL下载与安装
    SVN图标不显示问题
    excel 批量生成SQL语句
    版本管理工具
    RSA加密、解密、签名、验签的原理及方法
    获取客户端内网IP
    eclipse 添加svn插件
  • 原文地址:https://www.cnblogs.com/xindoo/p/3595140.html
Copyright © 2011-2022 走看看