原题链接:https://leetcode-cn.com/problems/minimum-path-sum/description/
题目描述:
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
AC代码:
int min(int a,int b){
return a<b?a:b;
}
int minPathSum(int** grid, int gridRowSize, int gridColSize) {
int m=gridRowSize,n=gridColSize;
int dp[n+5];
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(i==0){
if(j==0)
dp[j]=grid[i][j];
else
dp[j]=dp[j-1]+grid[i][j];
}
else if(j==0){
dp[j]+=grid[i][j];
}
else {
dp[j]=min(dp[j],dp[j-1])+grid[i][j];
}
}
}
return dp[n-1];
}
思路大概就是初始化上边界的节点,然后每个节点dp时搜索上左两节点就好
状态转移方程:dp[j]=min(dp[j],dp[j-1])+grid[i][j];
内存优化:每次遍历时只用到上左节点,每次新的遍历时,数组里存放上层节点,所以从左到右遍历,左边界直接继承上层节点,其他节点则状态转移;