dp(1): 跳台阶问题

问题:共n层台阶,每次只能上1级或者2级,问有多少种上台阶的方法。

首先分析一下题目,一般这种问题我都会先找一下规模最小的数值来分析一下,可以看到,上一层的走法是1种(1),上2层的走法是2种(11, 2),三层有3种(12, 21, 111),四层有5种(1111, 22, 211, 121, 112)……偷偷发现好像是斐波那契序列。。那要怎么样证明后边的数呢?
不清楚,那就设个x呗。设x为走到第n层的走法总和。可以这样想,我差一步就要到第n层了,那我就一定是在 n-1 或者 n-2 那里,设 走到 n-1 的走法和为 x1, 走到 n - 2的走法和为 x2, 那x = x1 + x2。

x1和x2称为问题的子结构,最终问题的解一定是根据他的子结构来解的。
1
最终的子结构是n = 1 和 n = 2的解,跟据这两个解可以推出最终解。
小解法:

class Solution {
public:
    int jumpFloor(int number) {
        if(number == 1)
            return 1;
        if(number == 2)
            return 2;
        int fir = 1, sec = 2;
        int sum;
        for(int i = 2; i < number; i++)
        {
            sum = 0;
            sum += fir + sec;
            fir = sec;
            sec = sum;
        }
        return sum;
    }
};

动态规划的经典是背包问题,上边这个算是最基础的动态规划。
动态规划的理论推导可以上wiki看:
https://en.wikipedia.org/wiki/Dynamic_programming

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值