hdoj1003 java_HDUOJ-1003 Max Sum(最大子序列和)(动态规划)

O(n)算法

首先,引用一个前人造好的轮子,此轮子来自《数据结构与算法分析-C语言描述》图2.8:

int MaxSubsequenceSum(const int A[],int N)

{

int ThisSum,MaxSum,j;

ThisSum = MaxSum = 0;

for(j=0;j

{

ThisSum += A[j];

if(ThisSum > MaxSum)

MaxSum = ThisSum;

else if(ThisSum < 0)

ThisSum = 0;

}

return MaxSum;

}

对于此算法可以作此理解:

对于(0-N)的每个(A[j]-A[N]),都做一次累加,将每次累加的结果做一次判断(小于零则舍弃),大于MaxSum则统计到MaxSum里,则N次循环内,必然会有一个最优解被更新为MaxSum的值。

状态转移方程为:

**dp[i] = max{ dp[i-1]+A[i] , A[i] } **

考虑到结尾并不需要每一个dp[i] , 其实用两个变量代替就可以:

ThisSum = max{LastSum+A[i] , A[i]}

本题的要求同时输出最大子序列的上界和下界,需要几个变量来统计。

改造后的完整代码为:

/*

* Created by zsdostar in 2016/4/30

*/

#include

using namespace std;

int start,endd;

int startm,endm;

int ThisSum,LastSum;

int maxx = -2147483648;

int MaxSubSequence(int arr[],int n)

{

for(int i=0;i

{

if(LastSum>=0)

{

ThisSum = LastSum + arr[i];endd = i;

}

else

{

ThisSum = arr[i];start = endd = i;

}

if(maxx<=ThisSum)

{

maxx = ThisSum;

startm = start;endm = endd;

}

LastSum = ThisSum;

}

return maxx;

}

int main()

{

int count,len;

int array[100001];

cin>>count;

for(int flag=1;flag<=count;flag++)

{

cin>>len;

for(int i=0;i

cin>>array[i];

start = endd = 0,maxx = -1001;

startm = endm = 0;

ThisSum = LastSum = 0;

cout<

cout<

if(flag

cout<

}

return 0;

}

关于本题有两个问题:

-目前的轮子通过大于小于0来判定是否更新状态,那么如果整个数组全都是负数,或者正数数量等于1,那么结果是错的

-HDU1003的测试数据也没有考虑问题1,导致考虑不全的代码也能通过

下次复习这道题的时候解决这个问题,更新考虑更全面的代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值