动态规划在实际业务中的路径优化应用:从算法到场景
前言
今天,我们将利用动态规划的思想解决"62. 不同路径 - 力扣(LeetCode)"问题,并探讨这一思路在实际场景中的应用。话不多说,直接进入主题,开始我们的解题之旅吧!
题目描述
⼀个机器⼈位于⼀个 m x n ⽹格的左上⻆ (起始点在下图中标记为 "Start" )。 机器⼈每次只能向下或者向右移动⼀步。机器⼈试图达到⽹格的右下⻆(在下图中标记为 "Finish" )。 问总共有多少条不同的路径?
示例 1: 输⼊:m = 3, n = 7
输出:28
示例 2:
输⼊:m = 2, n = 3
输出:3
解释: 从左上⻆开始,总共有 3 条路径可以到达右下⻆。
- 向右 -> 向右 -> 向下
- 向右 -> 向下 -> 向右
- 向下 -> 向右 -> 向右
示例 3:
输⼊:m = 7, n = 3
输出:28
示例 4:
输⼊:m = 3, n = 3
输出:6
提示:
1 <= m, n <= 100
题⽬数据保证答案⼩于等于 2 * 10^9
思路分析
- 确定 dp 数组及其下标的含义:dp(存放每格有多少个到达方法的数组),dp[i][j](到达第 i 行第 j 列有多少种方法)
- 递归公式:dp[i][j]=dp[i-1][j]+dp[i][j-1]
- 初始化 :dp[0][j]=1,dp[i][0]=1(到第 1 行的所有格子,只有一种方法,就是从最左边过去,同理,到第 1 列的所有格子,也只有)一种方法,即从最上面下去
- 遍历顺序:i=0,j=0=>i=m-1,j=n-1 5.** 打印 dp 数组**
伪代码
scss
function main(m,n){
//创建二维dp数组
var dp=Array.from({ length: m }, () => new Array(n).fill(0));
//初始化 dp[0][j],dp[j][0]为1
for(let i=0;i<m;i++)dp[i][0]=1;
for(let j=0;j<n;j++)dp[0][j]=1;
//遍历
for(let i=1;i<m;i++){
for(let j=1;j<n;j++){
dp[i][j]=dp[i-1][j]+dp[i][j-1]
}
}
return dp[m-1][n-1]
}
应用场景
不同路径这种思路,在真实场景的应用中,非常广泛。例如:产品组合优化
,游戏中的路径选择
。
产品组合优化
场景描述
投资者通常面对多种资产(如股票、债券、基金等),需要合理分配资金,以在规定的风险水平下实现收益最大化。选择合适的投资路径(即投资分配策略)是一个复杂的问题,因为市场存在多种不确定性。
应用
动态规划可以用来计算在不同市场条件下,投资组合的多种可能配置路径。每种路径对应不同的资产分配方案,考虑到历史数据、风险预期、相关性等因素,评估每条路径的预期收益和风险值。算法通过递归计算,找出最优的投资路径组合。
优势
帮助投资者在复杂的市场环境中做出最优决策,提高投资回报,同时有效控制风险。
回合制游戏中的最优行动路径
场景描述
在回合制策略游戏中(如《火焰纹章》或《XCOM》系列),角色在每回合中有一定的行动步数,选择正确的移动路径决定了角色是否能攻击到敌人、是否暴露在敌人射程内等。
应用
利用动态规划,计算角色的行动步数和移动路径,使得角色在最少的步数内达到有利位置,最大化攻击机会并最小化被攻击风险。
优势
提升游戏的战略深度,玩家可以通过精细的路径规划获得战斗优势。
总结
今天我们一起学习了如何解决最短路径问题,并探讨了它在实际业务场景中的应用。以上就是今天的全部内容了,如有任何错误或不足,欢迎大家留言指正,非常感谢大家的关注与支持!