求出最大的一个子数组和

wanglaibing 2009-08-06 06:09:12
一个数组(里面有正数和负数)求出最大的一个子数组和,
子数组是连续的,长度没有限制。

哪位朋友能用一次循环把结果得出?


maxsofar = 0;
for(i=0;i <n;i++){
sum=0;
for(j = i;j <n;j++){
sum+= x[j]; //sum is sum of x[i..j]
maxsofar = max(maxsofar,sum);
}
}
(这里用了两次)

把这个改成递归(只要里面一次循环)可以不?不知怎么改???
...全文
251 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
hsf1002 2009-08-27
  • 打赏
  • 举报
回复
mark 4楼
mstlq 2009-08-07
  • 打赏
  • 举报
回复
十分抱歉,8楼说法有误,请楼主无视>_<
mstlq 2009-08-07
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 liao05050075 的回复:]
最大子段和问题
使用DP可以做到O(n),也就一次for

int MaxSum(int n,int *a)
{
  int sum=0,b=0;
  for(int i=0;i <n;i++)
  {
      if(b>0) b+=a[i];
      else b=a[i];
      if(b>sum) sum=b;
  }
  return sum;
}
其中b表示,以a[i]为结束位置的最大子段和
[/Quote]

提醒楼主,这种做法和3楼的一样,遇到下面的情况是会得出不正确的结果的
测试例子

{ 2,3,-1,98 ,-5}
starcat 2009-08-07
  • 打赏
  • 举报
回复
Mark Allen Weiss那本书的。

#include <stdio.h>
int MaxSubsequenceSum( const int A[], int N )
{
int ThisSum, MaxSum, j;

ThisSum = MaxSum = 0;
for( j = 0; j < N; j++)
{
ThisSum += A[ j ];

if( ThisSum > MaxSum )
MaxSum = ThisSum;
else if( ThisSum < 0 )
ThisSum = 0;
}
return MaxSum;
}

main()
{
int arr[10] = {4, -3, 5, -2, -1, 2, 6, -2};
int result;
result = MaxSubsequenceSum( arr, 8 );
printf("MaxSum is :%d\n", result );
}
wanglaibing 2009-08-07
  • 打赏
  • 举报
回复
我采用了4楼的
zhusizhi007 2009-08-07
  • 打赏
  • 举报
回复
好,学习中,三楼的应该是正确的。。。。。
wanglaibing 2009-08-07
  • 打赏
  • 举报
回复
分太少了,不过我这份情义在,请你们接受,谢大家了
pengzhixi 2009-08-07
  • 打赏
  • 举报
回复
mark
liyudefly 2009-08-07
  • 打赏
  • 举报
回复
3楼正解。
amossavez 2009-08-07
  • 打赏
  • 举报
回复
这道题在数据结构与算法c版那本书上有,3楼的就是最佳解法
jiayucunyan 2009-08-07
  • 打赏
  • 举报
回复
不好意思
lz
昨天下班,回家了
我认为3楼,正解
jinwei1984 2009-08-06
  • 打赏
  • 举报
回复
DP
kakashi0309 2009-08-06
  • 打赏
  • 举报
回复
mark
liao05050075 2009-08-06
  • 打赏
  • 举报
回复
最大子段和问题
使用DP可以做到O(n),也就一次for

int MaxSum(int n,int *a)
{
int sum=0,b=0;
for(int i=0;i<n;i++)
{
if(b>0) b+=a[i];
else b=a[i];
if(b>sum) sum=b;
}
return sum;
}
其中b表示,以a[i]为结束位置的最大子段和
guoyichao 2009-08-06
  • 打赏
  • 举报
回复
maxsofar = 0;
sum = 0;
for(i=0;i <n;i++){
sum += x[i];
if (sum < 0) {
sum = 0;
continue;
}
if (maxsofar < sum) maxsofar = sum;
}
kojie_chen 2009-08-06
  • 打赏
  • 举报
回复
我记得软件设计师考试的那本书里有这个完全详解
kojie_chen 2009-08-06
  • 打赏
  • 举报
回复
典型的动态规划,DP问题

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧