为什么说这个世界的本质就是动态规划(Dynamic Programming,DP)?
什么是动态规划
码农界的的DP,通常是刷题时的最难的题型,常见于Leetcode周赛的最后一题。
然而到底什么是DP呢?
是一种算法思想。
核心部分就是要记住之前计算过的最优策略。
aka,查表。
而这其实也是世界运行和人类决策的基本逻辑。
最优路径规划就是最常见的DP问题。
还有最经典的斐波那契数列。
大模型届的KV Cache就是经典的DP思想。
所有的LRU Cache / Redis / CDN,都是一样的思想。
这里可以有无数的计算机科学的例子,然而更重要的,是人类的生活中的启发。
现实中有哪些DP呢?
当你在思考时,你并不是从零开始,而是从最近一次相关的记忆出发。我们的大脑并不擅长即时全局计算,而擅长的是调用已有的、曾经出现过的模式片段。就像动态规划中的“记忆化搜索”(memoization):你遇到一个子问题,先查一下有没有存过解,如果有,就直接复用。
下棋
下棋时,开局时记忆而非计算,而是已经知道怎么下了。
你的当头炮马来条,你的后翼弃兵,你的金角银边草肚皮,都是人类在无数次对弈中总结出来的DP表。
一位职业棋手在开局时,并不需要每步都从头分析。他落子的依据,往往是记忆中无数次练习过的开局套路。这些记忆,可能来源于:
- 上百盘实战;
- 书籍中的定式;
- 师傅讲解过的局面;
- 模糊的视觉图像。
他的大脑在做的,是快速匹配当前局势与脑海中“记忆库”中的一条路径。
这些步骤往往时人类所有的经验合成的DP表。
高手往往可以背谱背很多步。
思考,往往起源于“查表”
我们每次思考,其实大多是在潜意识里问自己:
我以前有没有遇到过类似的情况?
我听谁说过类似的故事?
有没有一条熟悉的解释可以套用?
这其实就是在调用一个“人类版的DP表”——一个被我们经验、教育、文化所不断写入和更新的巨大缓存系统。
第一性原理
当然了,也有例外。
第一性原理,就是要打破最近的DP表,找到更加稳定的起点。
记忆有限。有时候它会过时、偏差或根本不适用。
这时候,我们需要做的就是找到更原始的逻辑起点。
这就像是,在一个充满缓存的系统中,人为执行一次冷启动:不依赖旧结果,强行重新求解一次。
总会有伟大的人,带领我们找到更原始的逻辑起点。
比如牛顿,比如爱因斯坦。
比如高斯。
比如Hinton教授。
站在巨人的肩膀
所以,这给了我们一个极其深刻的启发:
我们为什么要学习?
不是为了考试,不是为了显得聪明——而是为了抓取别人已经写好的DP表。
学语言的过程
我们小时候并不理解语法规则,但会先模仿、先背诵。 “早上好”、“我爱你”、“你吃饭了吗”——这些语句我们一开始并不理解结构,而是直接调用记忆。就像语言模型预训练阶段,只是暴力堆积token的统计模式。
但随着记忆表的积累到一定程度,突然之间:
语言“涌现”了。你开始能组句,能表达,能跳出例句创造新话语。
这不是灵光乍现,而是DP表足够大、状态覆盖足够广之后,自然出现的结果。
启发
在这个世界上,有人花了一生,走完了一条复杂而艰难的路径,把中间每一步都记录了下来。而我们学习的意义,就是把这些“中间结果”加载进自己大脑的缓存表,省去反复试错的代价。
- 看书,是提取他人沉淀下来的经验片段;
- 看传记,是复制一整段人生的“状态转移轨迹”;
- 看视频、听讲座,是快速吸收别人的观察角度和认知模式;
- 而上学,则是系统性地加载人类在某一领域集体编写好的DP表。
你越能精准调用这些已有的“记忆表”,就越能在关键时刻快速出解,甚至跳出常规,产生新解。
甚至一生中,只需要调用这些DP表,就可以很好的过完一生。 当然了,你还是想要活出自己精彩的一生。
你不是天才,但你可以背下很多天才的中间步骤。
你不是巨人,但你可以复用巨人的路径。
你不是从0开始,而是从99%的已有答案出发,去寻找那个独属于你的“最后一步”。