动态规划(Dynamic Programming)
introduction
大部分书籍介绍“动态规划”时,都会从“菲波纳切数列”讲起。
菲波纳切数列
递归解法
C++ 代码如下
unsigned long int fib(const int n) {
switch (n)
{
case 0:
return 0;
case 1:
return 1;
default:
return fib(n - 1) + fib(n - 2);
}
}
DP
解决 DP 问题的关键因素之一,是要找出问题递归方程,然后就好解了。
菲波纳切数列的递归定义如下:
纯 DP
自底向上,使用数组存储过程值。
unsigned long int fib(const int n) {
vector<unsigned long int> sum;
sum.push_back(0);
sum.push_back(1);
for (int i = 2; i <= n; i++) {
sum.push_back(sum[i - 1] + sum[i - 2]);
}
return sum[n];
}
优化 DP
自底向上,但是没有使用数组存储过程值——不记录全局解(过程值)的 DP 算法,其本质就类似于贪心算法了。
unsigned long int fib(const int n) {
switch (n)
{
case 0:
return 0;
case 1:
return 1;
}
unsigned long int a = 0, b = 1, sum = 0;
for (int i = 2; i <= n; i++) {
sum = a + b;
a = b;
b = sum;
}
return sum;
}
经典 DP 题解
最大连续子数组和问题
递归方程
curr(i) = max(0, curr(i-1)) + arr[i]
如果 curr > result ,则更新 result = curr,否则 result 保持原值
解题代码
int maxSubArray(const vector<int> &v) {
int curr = 0;
int ret = v[0];
for (auto e : v) {
if (curr >= 0) {
curr += e;
}
else {
curr = e;
}
ret = curr > ret ? curr : ret;
}
return ret;
}
智慧在街市上呼喊,在宽阔处发声。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)