您的位置:首页 > 其它

DP之简单的求最大字段和问题

2013-06-13 15:40 239 查看
用DP的方式处理最大字段和问题,显然是很有效率的O(n)的时间复制度

设b[j]:
第1到第j个数中,从第i个数一直加到第j个数的和的最大值。就是从a[i]+a[i+1]+…+a[j]连续相加

a: -2 11 -4 13 -5  -2
b= -2 11  7 20 15  13

如果b<0的话,显然,就不用算之前的数据了,如果全部为0,就定义最长字段的和为0。
(代码中没处理,需要的话开始判定一下就行)

然后,最大字段和的其实就是b中最大的数据

求这个序列的话,最大值对应位置之前的第一个不小于0的位置一直到最大值之间的序列就是最大子段和对应的子序列。

C++语言:

#include
using
namespace
std;
int
MaxNum(int
a[],int n);
int
main()
{

   int
a[6] = {-2,11,-4,13,-5,-2};

   cout<<"最大字段和是:"<<MaxNum(a,6)<<endl;
}

int
MaxNum(int
a[],int n)
{

   int
i,b,sum;

   b=0;sum=0;

   for(i = 0 ;
 i
<</span> n ;
i ++)

   {

     
 if(b>0)
   b += a[i];

     
 else b
= a[i];

     
 if(b
> sum)sum=b;

   }

   return
sum;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: