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

  • 相关阅读:
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
  • 原文地址:https://www.cnblogs.com/philippica/p/4006966.html
Copyright © 2011-2022 走看看