动态规划入门理解

对动态规划,做个总结,我们从一个例子开始:

有一座高度是10级台阶的楼梯,从下往上走,每跨一步只能向上1级或者2级台阶。要求用程序来求出一共有多少种走法。

这里就要用到了动态规划的思想了:动态规划(Dynamic Programming)是一种分阶段求解决策问题的数学思想。总结来说就是复杂问题细化成为一个阶段性的问题,然后推导出整体问题的解决方法。

我们用动态规划问题来看看上述的问题吧:

问题分析:
假如只差一步就能走完整个楼梯,要分为几种情况?因为每一步能走一级或者两级台阶,所以有如下两种情况:

1.最后一步走2级台阶,也就是从8级到10级

2.最后一步走1级台阶,也就是从9级到10级

那么在上面的基础上假设1级到8级有X种走法,1级到9级有Y种走法,那么1级到10级有几种走法?

实际上,10级台阶的所有走法可以根据最后一步的不同分为两个部分。

第一部分:最后一步从9级到10级,这种走法的数量和1级到9级的数量一致,也就是Y种。
第二部分:最后一步从8级到10级,这种走法的数量和1级到8级的数量一致,也就是X种。

总的走法就是两种走法的总和,也就是SUM=X+Y种。

我们把10级台阶的走法表达为F(10)此时:

F(10) = F(9)+F(8)
F(9) = F(8)+F(7)
F(8) = F(7)+F(6)

F(3) = F(2)+F(1)

这里我们把一个复杂的问题分阶段分步的简化,简化成简单的问题,这就是动态规划的思想。

当只有1级台阶和2级台阶时走法很明显,即F(1)=1、F(2)=2,可以归纳出如下公式:

F(n) = F(n-1) + F(n-2)(n >= 3);
F(2) = 2;
F(1) = 1;

动态规划中包含三个重要的概念,最优子结构、边界、状态转移公式。

上面我们分析出F(10)=F(9)+F(8), 其中,F(9)和F(8)是F(10)的最优子结构。

当只有1级和2级台阶时,我们可以直接得出结果,而无需再次简化。我们称F(2)和F(1)是问题的"边界",如果一个问题没有边界,那么这个问题就没有有限解。

F(n) = F(n-1) + F(n-2)是阶段之间的状态转移公式,它是动态规划的核心,决定了问题的每个阶段和下阶段之间的关系。

至此,动态规划的“问题建模就完成了”。

解题代码:


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class PaLouTi {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int i = Integer.parseInt(br.readLine());
        System.out.println(pailou(i));
    }

    private static int pailou(int i) {
       int f[]=new int[i+1];
       f[0]=1;
       f[1]=2;
        for (int j = 2; j <i ; j++) {
            f[j]=f[j-1]+f[j-2]; //动态规划核心
        }
        return f[i-1];

    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值