Question:
Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path.
Note: You can only move either down or right at any point in time.
Tags: Array, Dynamic Programing
对一个m*n的矩阵,从左上角走到右下角,求经过路径的最小值。
Analysis
首先要明白什么是动态规划,动态规划算法通常基于一个递推公式及一个或多个初始状态。 当前子问题的解将由上一次子问题的解推出。
对于一个m*n的矩阵,要走到最后一个格(第m-1行,第n-1列),回溯一步,它可由:
- 第m-2行,n-1列向右一步
- 第m-1行,n-2列向下一步
得到。我们通过对比走到m-2行,n-1列和m-1列,n-1行的大小便可以判断最后一格由哪种方法得来。以此类推。这便是这个程序的动态规划思想。
Code
int minPathSum(int** grid, int gridRowSize, int gridColSize) {
for(int i=0;i<gridRowSize;++i){
for(int j=0;j<gridColSize;++j){
if(i==0){
if(j!=0){
grid[i][j]=grid[i][j-1]+grid[i][j];
}
}
else if(j==0){
grid[i][j]=grid[i-1][j]+grid[i][j];
}
else{
grid[i][j]=(grid[i-1][j]>grid[i][j-1]?grid[i][j-1]:grid[i-1][j])+grid[i][j];
}
}
}
return grid[gridRowSize-1][gridColSize-1];
}