最大子段和

来源:互联网 发布:北京电脑数据恢复公司 编辑:程序博客网 时间:2024/06/05 04:13
令b[j]表示以位置 j 为终点的所有子区间中和最大的一个
子问题:如j为终点的最大子区间包含了位置j-1,则以j-1为终点的最大子区间必然包括在其中
如果b[j-1] >0, 那么显然b[j] = b[j-1] + a[j],用之前最大的一个加上a[j]即可,因为a[j]必须包含
如果b[j-1]<=0,那么b[j] = a[j] ,因为既然最大,前面的负数必然不能使你更大

实例


int max = 0;int b[n+1];int start = 0;int end = 0;memset(b,0,n+1);for(int i = 1; i <= n; ++i) {   if(b[i-1]>0)   {     b[i] = b[i-1]+a[i];   }else{     b[i] = a[i];   }   if(b[i]>max)     max = b[i]; } 



动态规划法的计算时间复杂度为O(n),是最优的解。做几道题加深理解

最直白的LIS题:http://acm.hdu.edu.cn/showproblem.php?pid=1087

最大子段和升级版,最大M段和:http://acm.hdu.edu.cn/showproblem.php?pid=1024

0 0
原创粉丝点击