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

在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>}
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++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号