关于动态规划解题步骤和两个重要性质的理解---以最长递增子序列为例

首先要感谢自己幸运地看到了慕课网上,北大老师的程序设计与算法课。讲得真心不错,推荐一看。


说明:该文章所直接使用的动态规划解题步骤来自上述的课程,不再具体讲解,直接使用。看另外,该文章以步骤的第一步为主,重点讲解无后效性,后面三步不再赘述。

1:把原问题化为子问题。首先考虑的是----“求序列前i个元素的最长递增子序列”, 即可以定义F(i)=x ;x是当前状态的值。进一步分析,虽然,状态的值只有一个,但是到达这个状态的途径有很多,进一步想F(i+1),如果这些不同途径中的某个途径(序列)的最后一个元素比ai+1小,那么F(i+1)就会是更长的子序列;反之,如果不比ai+1小,F(i+1)就不一样了。 这样,F(i+1)的值不仅与当前状态的值(x)有关了也就不满足无后效性。补充:(无后效性定义)当前的若干个状态的值一旦确定,则此后过程的演变就只和这若干个状态的值有关,和之前采取哪种手段或经过哪条路径演变到当前这若干个状态无关。

所以,子问题这么划分是不适合用动态规划的。我们接下来换个子问题的设法。 “子问题为以元素ai结尾的最长递增子序列”,即F(ai)=x;这样就保证了,在我们求出了所有的解以后,找出最大的那个就可以了。为什么满足了呢?我们这样想,我们最后会求出所有元素的F(ai),这些值可能相等可能不等,但不管如何,最后我们要把这些值求最大值,根本不用管到达max(F[ai])经过了那些值,所以只与状态的值有关。

2:确定状态 即每个元素的下标k,因为状态只包含一个变量,所以存储状态值的数组是一维的。即maxvalue【n】;


3:确定一些初始状态的值,在这里我们把初始状态都初始化为1,即以自身结尾的最低要求是一个长度。

4:状态转移方程   网上一搜就看到,不再赘述。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值