题目链接
给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:一个机器人每次只能向下或者向右移动一步。
C 代码如下
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int minPathSum(int** grid, int gridSize, int gridColSize)
{
int rows = gridSize, columns = gridColSize;
if(rows == 0 || columns == 0)
{
return 0;
}
int dp[rows][columns];
dp[0][0] = grid[0][0];
for(int i = 1; i < rows; i++)
{
dp[i][0] = dp[i - 1][0] + grid[i][0];
}
for(int j =1; j < columns; j++)
{
dp[0][j] = dp[0][j -1] + grid[0][j];
}
for(int i =1; i < rows; i++)
{
for(int j = 1; j < columns; j++)
{
dp[i][j] = fmin(dp[i-1][j],dp[i][j - 1]) + grid[i][j];
}
}
return dp[rows - 1][columns - 1];
}
int main()
{
int n, m;
int result = 0;
while(scanf("%d %d\n", &n, &m) != EOF)
{
int** arr = (int **)malloc(sizeof(int*)*n);
for(int i =0; i < n; i++)
{
arr[i] = (int*)malloc(sizeof(int) * m);
}
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
scanf("%d ", &arr[i][j]);
}
}
result = minPathSum(arr, n, m);
printf("%d", result);
}
return 0;
}