深入理解动态规划:从入门到精通
创作时间:
作者:
@小白创作中心
深入理解动态规划:从入门到精通
引用
CSDN
1.
https://m.blog.csdn.net/2302_77582029/article/details/146291539
动态规划(Dynamic Programming, DP)是一种通过将问题分解为子问题,并保存子问题的解,避免重复计算的算法设计方法。它广泛应用于各种优化问题,如背包问题、最长公共子序列等。本文将从基本概念、实现方法、典型应用场景到优化技巧,全面介绍动态规划的核心内容。
动态规划的基本思想
定义
动态规划是一种通过将问题分解为子问题,并保存子问题的解,避免重复计算的算法设计方法。
适用条件
- 最优子结构:问题的最优解包含子问题的最优解。
- 重叠子问题:子问题之间存在重叠,可以复用解。
示例
以斐波那契数列为例:
- 问题:计算第n个斐波那契数。
- 子问题:计算第(n-1)和第(n-2)个斐波那契数。
- 重叠子问题:计算第(n-1)个数时需要计算第(n-2)个数。
动态规划的实现
以下是动态规划的经典问题——斐波那契数列的C++实现代码。
代码实现
#include <iostream>
#include <vector>
using namespace std;
int fibonacci(int n) {
if (n <= 1) return n;
vector<int> dp(n + 1);
dp[0] = 0;
dp[1] = 1;
for (int i = 2; i <= n; ++i) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
int main() {
int n = 10;
cout << "斐波那契数列第 " << n << " 项: " << fibonacci(n) << endl;
return 0;
}
代码解析
- 状态定义:dp[i]表示第i个斐波那契数。
- 状态转移方程:dp[i] = dp[i - 1] + dp[i - 2]。
- 初始化:dp[0] = 0,dp[1] = 1。
- 空间优化:可以使用两个变量代替数组,减少空间复杂度。
动态规划的典型应用
背包问题
- 0-1背包问题:每个物品只能选择一次。
- 状态转移方程:dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i])。
- 完全背包问题:每个物品可以选择多次。
- 状态转移方程:dp[i][j] = max(dp[i-1][j], dp[i][j-w[i]] + v[i])。
最长公共子序列(LCS)
- 问题:求两个序列的最长公共子序列。
- 状态转移方程:
- 如果s1[i-1] == s2[j-1],则dp[i][j] = dp[i-1][j-1] + 1。
- 否则,dp[i][j] = max(dp[i-1][j], dp[i][j-1])。
最短路径问题
- Floyd-Warshall算法:求所有节点对之间的最短路径。
- 状态转移方程:dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j])。
编辑距离
- 问题:求将一个字符串转换为另一个字符串的最小操作次数。
- 状态转移方程:
- 如果s1[i-1] == s2[j-1],则dp[i][j] = dp[i-1][j-1]。
- 否则,dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1。
动态规划的优化
空间优化
- 使用滚动数组或变量代替二维数组,减少空间复杂度。
- 示例:斐波那契数列的空间优化。
int fibonacci(int n) {
if (n <= 1) return n;
int prev2 = 0, prev1 = 1;
for (int i = 2; i <= n; ++i) {
int curr = prev1 + prev2;
prev2 = prev1;
prev1 = curr;
}
return prev1;
}
状态压缩
- 使用位运算或其他技巧压缩状态表示,减少空间复杂度。
- 示例:旅行商问题(TSP)的状态压缩。
记忆化搜索
- 使用递归和记忆化技术实现动态规划,避免显式定义状态转移方程。
- 示例:斐波那契数列的记忆化搜索。
int fib(int n, vector<int>& memo) {
if (n <= 1) return n;
if (memo[n] != -1) return memo[n];
memo[n] = fib(n - 1, memo) + fib(n - 2, memo);
return memo[n];
}
动态规划的总结
动态规划是一种强大的算法设计方法,适用于具有最优子结构和重叠子问题的问题。通过理解其原理、实现方法和优化技巧,我们可以更好地应用它解决实际问题。无论是背包问题、最长公共子序列还是最短路径问题,动态规划都发挥着重要作用。
本文原文来自CSDN
热门推荐
《海贼王》真人版第三季前瞻:阿拉巴斯坦与空岛的改编挑战
重温经典:《海贼王》第三季那些令人难忘的场景
国内环境最佳的10座城市,适合60岁以上的人养生旅游,你去过几个
宁波自驾游拍照攻略:5个绝美打卡地详解
浙江自驾游打卡历史文化胜地:严子陵钓台、梅城古镇、南孔家庙
丽水自驾游:打卡最美自然奇观
浙南山水自驾游:从杭州到丽水的绝美风景线
大漠冰雪旅游季:春节最炫酷玩法推荐!
九寨沟vs哈尔滨:春节假期的冰雪奇缘
福建"非遗"服饰:穿在身上的文化传承
重庆千厮门大桥:新晋网红打卡地,夜景摄影的绝佳选择
重庆千厮门大桥打卡攻略:最佳观赏点、交通指南全解析
东极岛摄影攻略:捕捉最美瞬间
杭州西湖:网红打卡圣地,你值得拥有!
《海贼王》真人版爆火后,游戏改编能否再续辉煌?
Netflix《海贼王》第二季:路飞父亲登场!
和平精英年兽大作战攻略:团队协作与战斗技巧详解
春节必看:《小虎敦大英雄》成黑马?
和平精英年兽大作战新手必看!
惠山古镇景区:江南第一山的历史人文魅力
马来西亚必打卡:槟城、吉隆坡、马六甲美食大揭秘!
马来西亚自然奇观大揭秘:Taman Negara & Gulung Mulu
吉隆坡双子塔:451.9米高空俯瞰马来西亚
马来西亚深度游:打卡吉隆坡黑风洞彩虹阶梯
哪吒闹海首日登顶!春节档票房大战谁主沉浮?
《唐探1900》:创新与争议并存的春节档大片
贾玲韩寒春节档电影背后的资本局
浙江最美自驾游:浙东唐诗之路 & 钱塘江诗路
杭州西湖:十景深度游与文化探索
“粤菜师傅”助力“清远味道”,引爆地方经济