【leetcode详解】爬楼梯:DP入门典例(附DP通用思路 & 同类进阶练习)

实战总结:

vector常用方法:

创建一个长为n的vector,并将所有元素初始化为某一定值x

vector<int> vec(len, x)

代码执行过程中将所有元素更新为某一值x

fill(vec.begin(), vec.end(), x)

// 更多实战方法欢迎参考文章:

【vector】常用实战方法:增删改查(C++入门必看)_vector 增删查改-CSDN博客


题面


DP&记忆化通用思路总结

  • //DP思想:                                寻找与原问题 同类的 更小的子问题
  • //确定更小的同类问题:            可以用递归
  • //发掘大小问题的通用逻辑:     递归函数写什么
    • //递归函数基本构成:
      •         //确定这个递归函数返回什么结果
      •         //递归结束条件
      •         //递归函数主体
  • //什么时候用记忆化:
    • //存在大量重复计算时 <=> 递归函数参数相同,那么结果必然一样  

 AC代码见下,思路已在注释中清晰体现:

class Solution {
public:
    int climbStairs(int n) {
    	vector<int>rem(n+1, 0);
		//rem[i]用来记忆还有i级台阶时有多少种走法
		auto dfs = [&](auto& dfs, int i) -> int{
        //dfs返回:当还有i级台阶要走时,一共有几种走法。

			if(i < 0) return 0;//递归返回条件
			else if(i == 0) return 1;
            else if(rem[i] != 0) return rem[i];
			
            int res = 0;
			res += dfs(dfs, i-1);//最后一步走一级台阶
			res += dfs(dfs, i-2);//还是走两步?
                                 //两种走法相互独立,所以采用加法原理
            rem[i] = res;//记忆化
			return res;	
		};
		return dfs(dfs, n);
    }
};

 进阶DP练习推荐:

【leetcode】T3144 (附DP&记忆化通用思路)-CSDN博客

~希望对你有启发!~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值