hdu1003

1003】AC代码附详细注释及其思路分析(免费)

注:分析题目仅仅为了相互交流,请同学们尊重作者,谢谢合作。

1003是一道非常典型的动态规划类题目,思路比较清晰,但是题目中也有很多小陷阱,同学们要加以注意。

【解题思路】
在最初看到题目的时候,因为动态规划往往要存很多中间变量,因此想到数组是最方便的。但是要注意的是,题目中的N数值非常大,如果都采用数组来存储的话,会出现内存不足的情况,因此可以考虑用其他的方法。在本题中,可以分析到,在每次读入一个新的数据时,都可以根据新读入的数据和过去的一些记录的比较,来及时更新记录。
为了和以下代码对照,在思路中提到的各记录名称与代码相同。
num:输入的数据组数

len:每组数据的长度,即个数
temp:每次输入的数据暂时存放的位置
max:当前得到的最大和
begin:在当前最大和情况下,起始的位置
end:在当前最大和情况下,终止的位置
now:在读入目前的数据时,该数据能够达到的最大字串和(注意和max的值不等)
x:当记录可能出现一个新的最大字串起始点时,因为不知道新串的值是否会大于过去的记录max,因此先将起始点存起来
采用这种记录方式可以不分开讨论正数和负数的区别

下面模拟读入数据的过程:

当每次读入一个新数据的时候,这时候,now里面还是上一个数据位置记录的当前最大字串和。
如果temp+now<temp,即之前的字串和加上现有的数值还没有当前这一个数值大,那么说明当前的temp,一定可以成为一个新的串起始记录点,在此时,在x中记录下当前temp的位置,同时,将now值修改为当前的temp值。

如果temp+now>=temp,则说明字串向着和变大的趋势发展,这时候将now更新为temp+now。

之后再来分析整个串的最大字串问题。如果现在得到的这个now值已经大于了过去的max值,说明可以进行最大值的修改。在修改了之后,把记录字串尾位置的dir2改为当前位置,同时,这个串开始的位置就是刚才记录过的新串的开始位置的x。即可将x值赋给dir2。之所以要用x和dir1两个记录,是因为很可能有多个可能的新串位置,但不一定能超过之前记录的最大值。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值