递推算法及解题套路

数学归纳法

step 1: 验证k0成立

step 2: 验证如果ki成立,那么ki+1也成立

step 3: 联合step1与step2,证明由k0->kn成立

如何解决递推问题

1.确定递推状态

一个函数符号f(x),外加这个函数符号的含义描述

一般函数所对应的值,就是要求解的值

2.确定递推公式(ki->ki+1)

确定f(x)究竟依赖于哪些f(y)的值

3.分析边界条件(k0)

4.程序实现

递归 || 循环

70. 爬楼梯

cpp 复制代码
class Solution {
public:
    int climbStairs(int n) {
        vector<int> f(n + 1);
        f[0] = 1, f[1] = 1;
        for(int i = 2; i <= n; i++) f[i] = f[i - 1] + f[i - 2]; 
        return f[n];
    }
};

746. 使用最小花费爬楼梯

cpp 复制代码
class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
        int n = cost.size();
        vector<int> dp(n + 1);
        cost.push_back(0);
        dp[0] = cost[0];
        dp[1] = cost[1];
        for(int i = 2; i <= n; i++) dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i];
        return dp[n];
    }
};

120. 三角形最小路径和

cpp 复制代码
class Solution {
public:
    int minimumTotal(vector<vector<int>>& triangle) {
        int n = triangle.size();
        vector<vector<int>> dp;
        for(int i = 0; i < 2; i++) dp.push_back(vector<int> (n));
        for(int i = 0; i < n; i++) dp[(n - 1) % 2][i] = triangle[n - 1][i];
        for(int i = n - 2; i >= 0; --i){
            int ind = i % 2;
            int next_ind = !ind;
            for(int j = 0; j <= i; j++){
                dp[ind][j] = min(dp[next_ind][j], dp[next_ind][j + 1]) + triangle[i][j];
            }
        }
        return dp[0][0];

    }
};

53. 最大子数组和

cpp 复制代码
class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        for(int i = 1; i < nums.size(); i++) nums[i] += nums[i - 1];
        int pre = 0, ans = INT_MIN;
        for(auto x : nums) {
            ans = max(x - pre, ans);
            pre = min(x, pre);
        }
        return ans;
    }
};

122. 买卖股票的最佳时机 II

cpp 复制代码
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int ans = 0;
        for(int i = 1; i < prices.size(); i++){
            if(prices[i] > prices[i - 1]) {
                ans += prices[i] - prices[i - 1];
            }
        }
        return ans;
    }
};

198. 打家劫舍

cpp 复制代码
class Solution {
public:
    int rob(vector<int>& nums) {
        int n = nums.size();
        vector<vector<int>> dp;
        for(int i = 0; i < n; i++) dp.push_back(vector<int>(2));
        dp[0][0] = 0; dp[0][1] = nums[0];
        for(int i = 1; i < n; i++){
            dp[i][0] = max(dp[i - 1][0], dp[i - 1][1]);
            dp[i][1] = dp[i - 1][0] + nums[i];
        }
        return max(dp[n - 1][0], dp[n - 1][1]);
    }
};

322. 零钱兑换

cpp 复制代码
class Solution {
public:
    int coinChange(vector<int>& coins, int amount) {
        vector<int> dp(amount + 1);
        for(int i = 1; i <= amount; i++) dp[i] = -1;
        for(int i = 1; i <= amount; i++){
            for(auto x : coins){
                if(i < x) continue;
                if(dp[i - x] == -1) continue;
                if(dp[i] == -1 || dp[i] > dp[i - x] + 1) dp[i] = dp[i - x] + 1;
            }
        }
        return dp[amount];
    }
};

300. 最长递增子序列

cpp 复制代码
class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        vector<int> dp(nums.size());
        int ans = 0;
        for(int i = 0; i < nums.size(); i++){
            dp[i] = 1;
            for(int j = 0; j < i; j++){
                if(nums[j] >= nums[i]) continue;
                dp[i] = max(dp[i], dp[j] + 1); 
            }
            ans = max(dp[i], ans);
        }
        return ans;
    }
};
相关推荐
ulias21215 分钟前
leetcode热题 - 5
数据结构·算法·leetcode
Funny_AI_LAB26 分钟前
Naval最新播客谈“氛围编码”:Vibe Coding 开启“一人独角兽”时代
人工智能·算法·语言模型·agi
如何原谅奋力过但无声26 分钟前
【灵神高频面试题合集04-05】二分查找
数据结构·python·算法·leetcode
我不是懒洋洋30 分钟前
【数据结构】排序算法(直接插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、归并排序、计数排序)
c语言·数据结构·c++·经验分享·算法·排序算法
MediaTea30 分钟前
ML:逻辑回归的基本原理与实现
人工智能·算法·机器学习·数据挖掘·逻辑回归
辛苦才能33 分钟前
数据结构--排序--插入排序(C语言,重点排序面试和比赛都会考察)
c语言·数据结构·面试
超级码力6669 小时前
【Latex文件架构】Latex文件架构模板
算法·数学建模·信息可视化
穿条秋裤到处跑9 小时前
每日一道leetcode(2026.04.29):二维网格图中探测环
算法·leetcode·职场和发展
Merlos_wind10 小时前
HashMap详解
算法·哈希算法·散列表
汉克老师10 小时前
GESP2025年3月认证C++五级( 第三部分编程题(1、平均分配))
c++·算法·贪心算法·排序·gesp5级·gesp五级