C语言实战:从爬楼梯问题解析动态规划的核心思想

1. 从生活场景理解爬楼梯问题

想象你面前有一座10层的楼梯,每次可以选择跨1级或2级台阶。这个问题看似简单,却蕴含着重要的算法思想。我第一次遇到这个问题时,第一反应是用穷举法列出所有可能,但当台阶数增加到20级时,组合数量已经爆炸性增长,这时候才意识到需要更聪明的解法。

让我们从小规模案例入手:

  • 1级台阶:只有1种方法(跨1步)
  • 2级台阶:2种方法(1+1或直接跨2步)
  • 3级台阶:3种方法(1+1+1,1+2,2+1)

你会发现一个规律:到达第n级台阶的方法数,等于到达(n-1)级和(n-2)级方法数的和。这是因为最后一步要么是从n-1级跨1步,要么是从n-2级跨2步。

2. 递归解法及其局限性

最直观的解法是递归:

int climbStairs(int n) { if (n == 1) return 1; if (n == 2) return 2; return climbStairs(n-1) + climbStairs(n-2); } 

但这种方法存在严重问题:重复计算。比如计算climbStairs(5)时需要计算climbStairs(3)和climbStairs(4),而climbStairs(3)又会被重复计算多次。时间复杂度是指数级的O(2^n),当n=40时计算量已经无法接受。

我在实际测试中发现,递归解法在n=45时需要近10秒才能得出结果,而优化后的动态规划解法只需不到1毫秒。

3. 动态规划的核心思想

动态规划通过存储中间结果来避免重复计算,包含三个关键要素:

  1. 最优子结构:问题的最优解包含子问题的最优解
  2. 边界条件:最小子问题的解
  3. 状态转移方程:如何由子问题的解得到更大问题的解

对于爬楼梯问

Read more

《从崩溃到精通:C++ 内存管理避坑指南,详解自定义类型 new/delete 调用构造 / 析构的关键逻辑》

《从崩溃到精通:C++ 内存管理避坑指南,详解自定义类型 new/delete 调用构造 / 析构的关键逻辑》

🔥草莓熊Lotso:个人主页 ❄️个人专栏:《C++知识分享》《Linux 入门到实践:零基础也能懂》 ✨生活是默默的坚持,毅力是永久的享受。  🎬博主简介: 目录  前言: 一.C/C++内存分布 1.1 内存分布问题 1.2 概念说明 二.C/C++中动态内存管理方式解析 2.1 C语言中动态内存管理方式:malloc/calloc/realloc/free 2.2 C++中内存管理方式 2.1.1 new/delete操作内置类型 2.1.2  new/delete操作自定义类型 2.1.

By Ne0inhk
C++ 面试题常用总结 详解(满足c++ 岗位必备,不定时更新)

C++ 面试题常用总结 详解(满足c++ 岗位必备,不定时更新)

📚 本文主要总结了一些常见的C++面试题,主要涉及到语法基础、STL标准库、内存相关、类相关和其他辅助技能,掌握这些内容,基本上就满足C++的岗位技能(红色标记为重点内容),欢迎大家前来学习指正,会不定期去更新面试内容。  Hi~!欢迎来到碧波空间,平时喜欢用博客记录学习的点滴,欢迎大家前来指正,欢迎欢迎~~ ✨✨ 主页:碧波 📚 📚 专栏:C++ 系列文章 目录 一、C ++ 语法基础 🔥 谈谈变量的使用和生命周期,声明和初始化 🔥 谈谈C++的命名空间的作用 🔥  include " " 和 <> 的区别 🔥 指针是什么? 🔥 什么是指针数组和数组指针 🔥 引用是什么? 🔥 指针和引用的区别 🔥 什么是函数指针和指针函数以及区别 🔥 什么是常量指针和指针常量以及区别 🔥 智能指针的本质是什么以及实现原理 🔥 weak_ptr 是否有计数方式,在那分配空间? 🔥 类型强制转换有哪几种? 🔥 函数参数传递时,

By Ne0inhk
C++入门看这一篇就够了——超详细讲解(120000多字详细讲解,涵盖C++大量知识)

C++入门看这一篇就够了——超详细讲解(120000多字详细讲解,涵盖C++大量知识)

目录 一、面向对象的思想 二、类的使用 1.类的构成 2.类的设计 三、对象的基本使用 四、类的构造函数 1.构造函数的作用 2.构造函数的特点 3.默认构造函数 3.1.合成的默认构造函数 3.2.手动定义的默认构造函数 四、自定义的重载构造函数 五、拷贝构造函数 1.手动定义的拷贝构造函数 2.合成的拷贝构造函数 3.什么时候调用拷贝构造函数 六、赋值构造函数 七、析构函数 八、this指针 九、类文件的分离 十、静态数据 1.静态数据成员 2.静态成员函数 十一、

By Ne0inhk
墨色规则与血色节点:C++红黑树设计与实现探秘

墨色规则与血色节点:C++红黑树设计与实现探秘

前言     前几天攻克了AVL树,我们已然是平衡二叉树的强者。但旅程还未结束,下一个等待我们的,是更强大、也更传奇的**终极BOSS**——红黑树。它不仅是map和set的强大心脏,更是C++ STL皇冠上的明珠。准备好了吗?让我们一起揭开它的神秘面纱。 1.红黑树的概念 1.1.红黑树是什么     红黑树是一科二叉搜索树,他的每个节点增加一个存储为代表着该节点的颜色,和它的名字一样,节点的颜色可以是红色或者是黑色。通过对任何一条根到叶子的路径上各个节点的颜色进行约束,红黑树确保没有一条路径会比其他路径长出2倍,因而是接近平衡的。     红黑树是被很多条规则进行束缚的二叉搜索树,通过这些规则,可以保证红黑树没有一条路径会比其他路径长出2倍,并且保持其相对平衡,下面我来讲述一下这些规则。 1.2.红黑树的规则     1.每个节点不是黑色的就是红色的(这肯定,不然不会被叫做红黑树了)。     2.根节点必须是黑色的     3.如果一个节点是红色的,则它的两个孩子节点必须是黑色的,也就是说任意一条路径上并不会出现连续的红色的节点。     4.对于任意的一个

By Ne0inhk