1.问题描述
给定一个包含非负整数的 m x n
网格 grid
,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:一个机器人每次只能向下或者向右移动一步。
2.示例
示例 1:
输入:grid = [[1,3,1],[1,5,1],[4,2,1]] 输出:7 解释:因为路径 1→3→1→1→1 的总和最小。
示例 2:
输入:grid = [[1,2,3],[4,5,6]] 输出:12
3.源码
#include <stdio.h>
#include <stdlib.h>
int minPathSum(int** grid, int gridSize, int* gridColSize)//定义二维数组grid,整数 gridSize,指针 griColdSize(作为参数返回整数)
{
int m = gridSize;
int n = gridColSize[0];
int** dp = (int**)malloc(sizeof(int*) * m);
for (int i = 0; i < m; i++)
{
dp[i] = (int*)malloc(sizeof(int) * n);
}dp[0][0] = grid[0][0];//数组dp元素指向m行n列的二维数组,并把grid中第一个元素赋值给dp素组第一个
// 初始化第一行和第一列
for (int i = 1; i < m; i++)
{
dp[i][0] = dp[i - 1][0] + grid[i][0];
}
for (int j = 1; j < n; j++)
{
dp[0][j] = dp[0][j - 1] + grid[0][j];
}
// 动态规划求解最小路径和
for (int i = 1; i < m; i++)
{
for (int j = 1; j < n; j++)
{
dp[i][j] = grid[i][j] + (dp[i - 1][j] < dp[i][j - 1] ? dp[i - 1][j] : dp[i][j - 1]);
}
}
int result = dp[m - 1][n - 1]; // 返回最小路径和
for (int i = 0; i < m; i++)
{
free(dp[i]);
}
free(dp);
return result;
}
int main()
{
int m, n;
printf("请输入网格的行数和列数:");
scanf_s("%d%d", &m, &n);
int** grid = (int**)malloc(sizeof(int*) * m);
for (int i = 0; i < m; i++)
{
grid[i] = (int*)malloc(sizeof(int) * n);
}
printf("请输入每个网格的数字:\n");
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
scanf_s("%d", &grid[i][j]);
}
}
int* gridColSize = (int*)malloc(sizeof(int) * m);
for (int i = 0; i < m; i++)
{
gridColSize[i] = n;
}
int minSum = minPathSum(grid, m, gridColSize);
printf("最短路径上的数字之和为:%d\n", minSum);
for (int i = 0; i < m; i++)
{
free(grid[i]);
}
free(grid);
free(gridColSize);
return 0;
}