剑指offer专题——动态规划

本文介绍了四种使用动态规划解决的经典算法问题:斐波那契数列、普通跳台阶、变态跳台阶以及矩形覆盖问题。通过递推公式和状态转移矩阵,详细解析了每种问题的解题思路和优化方法,并给出了相应的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

剑指offer 07——斐波拉契数列

题目描述

大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。
n ≤ 39

解题思路

斐波拉契数列
a0 = 0,a1 = 1,an = an-1 + an-2;
可用动态规划解决
算法优化,空间优化,无需存储每个状态

代码

int Fibonacci(int n) {
    if(n == 0)
        return 0;
    if(n == 1)
        return 1;
    vector<int> dp(n+1, 0);
    dp[1] = 1;
    for(int i = 2; i <= n; ++i) {
        dp[i] = dp[i-1] + dp[i-2];
    }
    return dp[n];
}

剑指offer 08——跳台阶

题目描述

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

解题思路

动态规划
设位于位置m,有f(m)种方式
当位于n-1的位置时,有f(n-1) = 1种
当位于n-2的位置时,有f(n-2) = 2种
当低于n-3的位置时,有f(n-3) = f(n-3+1) + f(n-3+2) = 3
代码如下

代码

int jumpFloor(int number) {
    if(number == 0)
        return 0;
    else if(number == 1)
        return 1;
    else if(number == 2)
        return 2;
    vector<int> nums(number+1, 0);
    nums[1] = 1;
    nums[2] = 2;
    for(int i = 3; i <= number; ++i) {
        nums[i] = nums[i-1] + nums[i-2];
    }
    return nums[number];
}

剑指offer 09——变态跳台阶

题目描述

一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

解题思路

动态规划
设位台阶高度为n,有f(n)种方式
当n=1时,有1种
当n=2时,有f(1)+1种
当n=3时,有f(2) + f(1) + 1种
即f(n) = f(n-1) + f(n-2) + f(n-3) + f(1) + 1
代码如下

代码

int jumpFloorII(int number) {
    if(number <= 1) return 1;
    vector<int> dp(number + 1, 0);
    dp[0] = dp[1] = 1;
    for(int i = 2; i <= number; ++i) {
        for(int j = 0; j < i; ++j) {
            dp[i] += dp[j];
        }
    }
    return dp[number];
}

剑指offer 10——矩形覆盖

题目描述

我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
比如 n=3 时,2 * 3的矩形块有3种覆盖方法:在这里插入图片描述

解题思路

动态规划
设长度为为n,有f(n)种方式
.
n = 1时,有一种方式
n = 2时,有两种方式
n = 3时,竖着放一块有f(2)种;横着放一块,有f(1)种;
f(n) = f(n-1) + f(n-2)

代码

int rectCover(int number) {
    if(number == 0 || number == 1)
        return number;
    vector<int> res(number + 1, 0);
    res[0] = res[1] = 1;
    for(int i = 2; i <= number; ++i)
        res[i] += (res[i-1] + res[i-2]);
    return res[number];
}**加粗样式**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值