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

  • 相关阅读:
    拆分跨天的时间数据
    模板
    更换数据库服务器迁移步骤
    缺失索引
    flex布局解说和属性
    Vuejs中关于computed、methods、watch,mounted的区别
    皮囊
    回家
    江苏旅游计划
    重写原生alert,弹出层过一会就消失
  • 原文地址:https://www.cnblogs.com/xindoo/p/3595140.html
Copyright © 2011-2022 走看看