题目描述
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例:
输入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
输出: 7
解释: 因为路径 1→3→1→1→1 的总和最小。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-path-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
---------------------------------------------------------------------------------------------------------------------------------
白话题目:
从左上走到右下,怎么走距离最短(注意:只能向下或者向右走)
-----------------------------------------------------------------------------------------------------------------------------------
算法:
同样也是一道动态规划的方法
现象最优的矩阵是怎么来的,只能从上面或者下面来。
详细解释关注 B站 【C语言全代码】学渣带你刷Leetcode 不走丢 https://www.bilibili.com/video/BV1C7411y7gB
C语言完全代码
#include <stdio.h>
#include <stdlib.h>
int min(int a,int b)
{
return a<b?a:b;
}
int minPathSum(int** grid, int gridSize, int* gridColSize)
{
printf("%d %d\n",gridSize,*gridColSize);
if(gridSize==0) return 0;
int row=gridSize;
int column=*gridColSize;
int dp[row][column];
int i;
int j;
for ( i = 0; i < row; i ++)
{
for ( j = 0; j < column; j ++)
{
dp[i][j] = 0;
}
}
dp[0][0]=grid[0][0];
for(i=1; i<column; i++)
{
dp[0][i]=grid[0][i]+dp[0][i-1];
}
for(i=1; i<row; i++)
{
dp[i][0]=grid[i][0]+dp[i-1][0];
for(j=1; j<column; j++)
{
dp[i][j]=min(grid[i][j]+dp[i-1][j],grid[i][j]+dp[i][j-1]);
}
}
return dp[row-1][column-1];
}
int main()
{
int gridSize;//m
int gridColSize;//n
printf("输入m*n大小,例如 (3 3)");
scanf("%d %d",&gridSize,&gridColSize);
printf("输入矩阵,例如 (1 3 1 1 5 1 4 2 1)\n");
int** grid=(int**)malloc(sizeof(int*)*gridSize);
int m,n;
for ( m = 0; m < gridSize; m ++)
{
grid[m]=(int*)malloc(sizeof(int)*gridColSize);
for ( n = 0; n< gridColSize; n ++)
{
scanf("%d",&grid[m][n]);
}
}
/*
int i,j;
for(i=0; i<gridSize; i++)
{
for ( j = 0; j < gridColSize; j ++)
{
printf("%d ",grid[i][j]) ;
}
printf("\n");
}
*/
int result=minPathSum(grid,gridSize, &gridColSize);
printf("%d\n",result);
return 0;
}