码迷,mamicode.com
首页 > 其他好文 > 详细

POJ2479【DP 枚举】

时间:2014-10-05 14:40:48      阅读:230      评论:0      收藏:0      [点我收藏+]

标签:io   os   for   sp   c   on   amp   r   ef   

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

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

//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 枚举】

标签:io   os   for   sp   c   on   amp   r   ef   

原文地址:http://www.cnblogs.com/philippica/p/4006966.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!