社区
数据结构与算法
帖子详情
关于DP中的最大子段和
javadream11
2009-08-20 03:23:48
给我详细解释下这个状态转移方程:b[j] = max{b[j-1]+a[j], a[j]}, 1<=j<=n
...全文
271
14
打赏
收藏
关于DP中的最大子段和
给我详细解释下这个状态转移方程:b[j] = max{b[j-1]+a[j], a[j]}, 1<=j<=n
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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]
黄舒颖 咸丫蛋
2009-08-20
打赏
举报
回复
正解,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
打赏
举报
回复
把题描述下?
用动态规划法求解
最大子段和
问题 C语言实现
用动态规划法求解
最大子段和
问题 C语言实现
最大子段和
分别用三重循环,分治法和动态规划算法来解决
最大子段和
问题,并比较三个算法效率的差异。内含c++源代码和实验报告说明
最大子段和
问题 蛮力法 分治法 动态规划法
算法设计与分析
中
最大子段和
问题的蛮力法、分治法和动态规划法
最大子段和
java实现
最大子段和
用java实现,同时利用了动态规划和分治两种方法实现
算法设计
最大子段和
课后作业来着,已经实现,供大家参考,有什么问题望指出修改
数据结构与算法
33,027
社区成员
35,336
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章