关于DP中的最大子段和

javadream11 2009-08-20 03:23:48
给我详细解释下这个状态转移方程:b[j] = max{b[j-1]+a[j], a[j]}, 1<=j<=n
...全文
321 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
  • 打赏
  • 举报
回复
把题描述下?
内容概要:SSD2828QN4是一款MIPI主桥接芯片,用于连接应用处理器与传统并行LCD接口及支持MIPI从属接口的LCD驱动器。该芯片支持最高每通道1Gbps的串行链路速度,最多可配置4个数据通道,显著减少了信号数量。它支持多种接口模式,包括RGB+SPI组合接口,适用于驱动智能或非智能显示面板,并能通过命令模式和视频模式传输数据。芯片内置时钟和复位模块、外部接口、协议控制单元(PCU)、包处理单元(PPU)、错误校正码/循环冗余校验(ECC/CRC)模块、长包和命令缓冲区、D-PHY控制器、模拟收发器以及内部锁相环(PLL),确保了高效的数据传输和系统稳定性。此外,文档详细描述了芯片的引脚分配、寄存器设置、操作模式、电源序列、时序特性等关键参数,为开发者提供了全面的技术指导。 适合人群:具备一定硬件设计基础,从事嵌入式系统开发、显示技术研究的研发人员。 使用场景及目标:①实现应用处理器与MIPI兼容显示屏之间的高速数据传输;②优化显示系统的功耗表现,减少电磁干扰(EMI);③通过灵活配置不同接口模式来适应各种显示设备的需求。 阅读建议:此文档面向具有一定电子工程背景的专业人士,建议读者结合实际项目需求深入理解各章节内容,特别是关于寄存器配置、时序要求等方面的具体说明。对于初次接触此类技术的开发者而言,建议先熟悉基本概念再逐步掌握高级功能的应用方法。

33,025

社区成员

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

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