动态规划(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;
}

posted @   健康平安快乐  阅读(209)  评论(0编辑  收藏  举报
编辑推荐:
· 从 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)
点击右上角即可分享
微信分享提示