hdu 1231 最大连续子序列

http://acm.hdu.edu.cn/showproblem.php?pid=1231

这道题目还是简单的DP,一开始不懂做,看了看解题报告,觉得有个思想特别好,因为当sum>0时sum加上当前值a[i]肯定比a[i]要大,而Sum<0时肯定要小,所以sum<0时,sum=a[i]。然后再利用max找出最大的和,并且用x,y标记始末位置,这里很巧妙的就可以不用处理0和全是负数的情况了,只有全是负数,max猜可能是负数,当max=0的时候,情况也包括在里面了,wa一次因为数组开小了,把10000看成1000了。。。。

代码如下:

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

int a[102][102];

void dp(int n)

{

     if(n==0)  return ;

     for(int j=n;j>=0;--j)

     {

             if(a[n][j]+a[n-1][j-1]<a[n-1][j-1]+a[n][j-1])

                   a[n-1][j-1]=a[n-1][j-1]+a[n][j-1];

                   else

                   a[n-1][j-1]=a[n][j]+a[n-1][j-1];

     }

     dp(n-1);

}

int main()

{

    int t,m;

    scanf("%d",&t);

    while(t--)

    {

              scanf("%d",&m);

              for(int i=0;i<m;++i)

              for(int j=0;j<=i;++j)

              scanf("%d",&a[i][j]);

              dp(m);

              printf("%d\n",a[0][0]);

              

    }

    system("pause");

    return 0;

}

原文地址:https://www.cnblogs.com/yuelingzhi/p/2125544.html