首页 > 后端开发 > C++ > 正文

c++中如何实现动态规划最小路径和_c++动态规划最小路径和方法

冰火之心
发布: 2025-09-27 11:37:01
原创
496人浏览过
最小路径和可通过动态规划求解,定义dpi为从(0,0)到(i,j)的最小路径和,状态转移方程根据边界条件分三种情况,初始化第一行和第一列后,递推填充其余位置,最终结果为dpm-1;空间优化版本使用一维数组将空间复杂度降为O(n),按行更新dp值,核心逻辑不变。

c++中如何实现动态规划最小路径和_c++动态规划最小路径和方法

在C++中实现动态规划求解“最小路径和”问题,通常针对一个二维网格,从左上角出发,每次只能向下或向右移动,目标是到达右下角并使路径上的数字之和最小。

啵啵动漫
啵啵动漫

一键生成动漫视频,小白也能轻松做动漫。

啵啵动漫 298
查看详情 啵啵动漫

问题描述

给定一个 m × n 的非负整数网格 grid,找出一条从左上角到右下角的路径,使得路径上所有数字的和最小。每次只能向下或向右移动。

动态规划思路

使用动态规划的关键是定义状态和状态转移方程:
  • 状态定义: dp[i][j] 表示从 (0,0) 到 (i,j) 的最小路径和。
  • 状态转移方程:
    • 如果 i > 0 且 j > 0:dp[i][j] = grid[i][j] + min(dp[i-1][j], dp[i][j-1])
    • 如果 i == 0 且 j > 0:只能从左来,dp[i][j] = grid[i][j] + dp[i][j-1]
    • 如果 j == 0 且 i > 0:只能从上来,dp[i][j] = grid[i][j] + dp[i-1][j]
  • 初始状态: dp[0][0] = grid[0][0]

C++ 实现代码

以下是一个完整、清晰的 C++ 实现:

#include <iostream><br>#include <vector><br>#include <algorithm><br>using namespace std;<br><br>int minPathSum(vector<vector<int>>& grid) {<br>    if (grid.empty() || grid[0].empty()) return 0;<br>    int m = grid.size();<br>    int n = grid[0].size();<br><br>    // 创建 dp 表,可以用原数组优化空间<br>    vector<vector<int>> dp(m, vector<int>(n));<br>    dp[0][0] = grid[0][0];<br><br>    // 初始化第一行<br>    for (int j = 1; j < n; ++j) {<br>        dp[0][j] = dp[0][j-1] + grid[0][j];<br>    }<br><br>    // 初始化第一列<br>    for (int i = 1; i < m; ++i) {<br>        dp[i][0] = dp[i-1][0] + grid[i][0];<br>    }<br><br>    // 填充其余状态<br>    for (int i = 1; i < m; ++i) {<br>        for (int j = 1; j < n; ++j) {<br>            dp[i][j] = grid[i][j] + min(dp[i-1][j], dp[i][j-1]);<br>        }<br>    }<br><br>    return dp[m-1][n-1];<br>}<br><br>// 测试示例<br>int main() {<br>    vector<vector<int>> grid = {<br>        {1, 3, 1},<br>        {1, 5, 1},<br>        {4, 2, 1}<br>    };<br>    cout << "最小路径和: " << minPathSum(grid) << endl; // 输出 7<br>    return 0;<br>}
登录后复制

空间优化版本

可以只用一维数组优化空间复杂度到 O(n):

int minPathSum(vector<vector<int>>& grid) {<br>    int m = grid.size(), n = grid[0].size();<br>    vector<int> dp(n);<br>    dp[0] = grid[0][0];<br>    <br>    // 初始化第一行<br>    for (int j = 1; j < n; ++j) {<br>        dp[j] = dp[j-1] + grid[0][j];<br>    }<br>    <br>    for (int i = 1; i < m; ++i) {<br>        dp[0] += grid[i][0]; // 更新每行第一个元素<br>        for (int j = 1; j < n; ++j) {<br>            dp[j] = grid[i][j] + min(dp[j], dp[j-1]);<br>        }<br>    }<br>    <br>    return dp[n-1];<br>}
登录后复制

基本上就这些。核心是理解状态转移逻辑,然后按行或按列递推即可。

以上就是c++++中如何实现动态规划最小路径和_c++动态规划最小路径和方法的详细内容,更多请关注php中文网其它相关文章!

相关标签:
c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号