关于DP中的最大子段和

javadream11 2009-08-20 03:23:48
给我详细解释下这个状态转移方程:b[j] = max{b[j-1]+a[j], a[j]}, 1<=j<=n
...全文
230 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
青蛙果果 2009-08-23
  • 打赏
  • 举报
回复
int MaxSum(int n,int *a)
{
int sum=0;
for(int i=1;i <n;i++)
{
a[i]=max( a[i-1]+a[i],a[i]);
sum=max( sum,a[i]);
}
return sum;
}


a[i] 表示以a[i]为结尾的子段的最大和 当然不一定是所要的最终和 比如1->i-1 和为9 而a[i]为-2,因而以a[i] 为结尾的最大和是7,对于整个数段来说至少应是9,因而用到sum来记录所要求的最大和
acdbxzyw 2009-08-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 peacefulby 的回复:]
b[j]=max{a[i]++a[j]},1 <=i <=j,且1 <=j <=n,则所求的最大子段和为max b[j],1 <=j <=n。
由b[j]的定义可易知,当b[j-1]>0时b[j]=b[j-1]+a[j],否则b[j]=a[j]。故b[j]的动态规划递归式为:
b[j]=max(b[j-1]+a[j],a[j]),1 <=j <=n。
T(n)=O(n)
[/Quote]
  • 打赏
  • 举报
回复
正解,Got it

[Quote=引用 11 楼 litaoye 的回复:]
转帖一个别人的吧

int MaxSum(int n,int *a)
{
  int sum=a[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;
}

引用 10 楼 javadream11 的回复:
引用 9 楼 litaoye 的回复:
O(n)的算法其实本质也是一种DP,而且是最经典的DP。


到底是怎么样的啊?

[/Quote]
绿色夹克衫 2009-08-20
  • 打赏
  • 举报
回复
转帖一个别人的吧

int MaxSum(int n,int *a)
{
int sum=a[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;
}

[Quote=引用 10 楼 javadream11 的回复:]
引用 9 楼 litaoye 的回复:
O(n)的算法其实本质也是一种DP,而且是最经典的DP。


到底是怎么样的啊?
[/Quote]
javadream11 2009-08-20
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 litaoye 的回复:]
O(n)的算法其实本质也是一种DP,而且是最经典的DP。
[/Quote]

到底是怎么样的啊?
绿色夹克衫 2009-08-20
  • 打赏
  • 举报
回复
O(n)的算法其实本质也是一种DP,而且是最经典的DP。
lingyun310 2009-08-20
  • 打赏
  • 举报
回复
这是个O(n)算法,只需要遍历一遍就可以了。。
showjim 2009-08-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 fire_woods 的回复:]
最大子段和不需要BP,有O(n)的算法.
[/Quote]
是的,从左到右扫一次就行了(中间要记录差值)
lingyun310 2009-08-20
  • 打赏
  • 举报
回复
看你这个方程,应该是先建立的一个数组,b[j]记录a[0]到a[j]的和,然后在数组b中查找符合条件的子段。即最后的结果是其中的一个极大值-它前面的某个极小值。
但是这个算法做了改进,即,和是负值的时候,就不做记录,也就是说,把极小值全部取作了0,这样一来,只要查找极大值就可以了。。。

这个方程就是计算数组b用的。。。如果当前b[j]小于0,那么重新开始记录a[j],也就是说,此时,前面有一段子段的和为负了,而分析一下,这一段负和是不可能出现在和最大子段里面的。。。。具体过程比较复杂,不写了。。。自己好好思考一下,就能想通的。
fire_woods 2009-08-20
  • 打赏
  • 举报
回复
最大子段和不需要BP,有O(n)的算法.
PeacefulBY 2009-08-20
  • 打赏
  • 举报
回复
b[j]=max{a[i]++a[j]},1<=i<=j,且1<=j<=n,则所求的最大子段和为max b[j],1<=j<=n。
由b[j]的定义可易知,当b[j-1]>0时b[j]=b[j-1]+a[j],否则b[j]=a[j]。故b[j]的动态规划递归式为:
b[j]=max(b[j-1]+a[j],a[j]),1<=j<=n。
T(n)=O(n)
xiaoyu821120 2009-08-20
  • 打赏
  • 举报
回复
我觉得这题的递推式应该是
if(b[j-1]<=0)
b[j]=a[j]
else
b[j]=b[j-1]+a[j];
b[0] = a[0]
javadream11 2009-08-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 peacefulby 的回复:]
把题描述下?
[/Quote]

给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。
PeacefulBY 2009-08-20
  • 打赏
  • 举报
回复
把题描述下?

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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