zoukankan      html  css  js  c++  java
  • POJ2479【DP 枚举】

    题意:给出一串数字,求出其中不重不交的两个子串的和的最大值

    思路:最近最大子串和做多了,感觉这题有点水。枚举分割点,将序列分成左右两串,然后看左右串的最大子串和的最大值。

    //poj2479

    #include<cstdio>

    #include<string.h>

    #include<iostream>

    #define inf 19941117

    using namespace std;

    const int maxn=50009;

    int maxf(int a,int b)

    {if (a>b)return a;else return b;}

    int main()

    {

       int t,a[maxn],left[maxn]={0},right[maxn]={0},n,l[maxn]={0},r[maxn]={0};

       scanf("%d",&t);

       while(t--)

        {

           scanf("%d",&n);

           for(int i=1;i<=n;i++)scanf("%d",&a[i]);

           right[n+1]=left[0]=l[0]=r[n+1]=-inf;

           for(inti=1;i<=n;i++)l[i]=max(left[i]=maxf(a[i],a[i]+left[i-1]),l[i-1]);

           for(inti=n;i>=1;i--)r[i]=max(right[i]=maxf(a[i],a[i]+right[i+1]),r[i+1]);

           int max=-inf;

           for(int i=1;i<=n-1;i++)

           max=maxf(r[i+1]+l[i],max);

           printf("%d ",max);

        }

       return 0;

    }

    调试小结:1WA 1 PE

    好吧 最大子序和有两种写法,一种是累加得到sum,一旦sum<0就给sum赋0的做法,另一种就是dp的方法:dp[i]=max{dp[i-1]+a[i],a[i]},两种写法本质上是等价的,其中第一种写法是我一直用的,空间复杂度为O(1),只是这题存在全部是负数的情况用第一种写法需要判断下,而正是判断的错误导致了第一次WA所以索性换了第二种写法就A了,那次PE是输出的行末没加空行  TUT

  • 相关阅读:
    在给定的区间上对每个数都开方 最后还是在一段上求和
    简单的覆盖问题,,通过覆盖的g不同 有这不同的价值 最后还是一段上求和
    codevs 3094 寻找sb4
    noi 04:网线主管
    codevs 1031 质数环
    codevs 1061 重复子串
    codevs 1204 寻找子串位置
    codevs 3223 素数密度
    各种用法
    codevs1073 家族
  • 原文地址:https://www.cnblogs.com/philippica/p/4006966.html
Copyright © 2011-2022 走看看