首页 > 代码库 > POJ2479【DP 枚举】

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\n",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是输出的行末没加空行 \nTUT

POJ2479【DP 枚举】