社区
数据结构与算法
帖子详情
关于DP中的最大子段和
javadream11
2009-08-20 03:23:48
给我详细解释下这个状态转移方程:b[j] = max{b[j-1]+a[j], a[j]}, 1<=j<=n
...全文
263
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语言实现
最后,`
dp
`数组
中
的最大值即为整个数组的
最大子段和
。 C语言实现如下: ```c #include #include int maxSubArray(int* nums, int numsSize) { if (numsSize == 0) return 0; int
dp
[numsSize];
dp
[0] = ...
最大子段和
最后,
dp
数组
中
的最大值就是
最大子段和
。动态规划法的时间复杂度为O(n),空间复杂度也为O(n),明显优于三重循环法。 在实验报告
中
,我们会对比这三种方法在不同规模数据下的运行时间和内存消耗,以验证动态规划法的...
最大子段和
问题 蛮力法 分治法 动态规划法
最大子段和
问题是一个经典的计算机科学
中
的算法问题,它的目标是找到一个整数数组
中
连续子数组的最大和。这个问题在很多实际应用
中
都有所体现,比如在数据分析、股票投资策略等领域。下面我们将深入探讨解决这一问题...
最大子段和
java实现
在这个代码
中
,
dp
变量存储了到当前位置为止的
最大子段和
,maxSum记录了当前找到的
最大子段和
。每次迭代,我们都更新这两个值,最后返回maxSum即为
最大子段和
。 接下来,我们讨论分治法(Divide and Conquer)。分治...
算法设计
最大子段和
在
最大子段和
问题
中
,我们可以定义一个状态变量`
dp
[i]`,表示以第`i`个元素结尾的
最大子段和
。初始时,`
dp
[0]`等于数组的第一个元素,然后对于每个`i`(从1到数组长度),我们可以计算`
dp
[i]`: ```markdown
dp
[i] ...
数据结构与算法
33,027
社区成员
35,335
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章