思路
- 和120题一样,从下往上看
- 动态规划,观察下一层的来源,
dp[i][j] = min(dp[i-1][j-1],dp[i-1][j],dp[i-1][j+1])+m[i][j]
注意两边的位置,来源少了,左边dp[i][j] = min(dp[i-1][j],dp[i-1][j+1])
,右边dp[i][j] = min(dp[i-1][j],dp[i-1][j-1])
代码
#include<stdio.h>
#define min(a,b) ((a)<(b)?a:b)
int minFallingPathSum(int** matrix, int matrixSize, int* matrixColSize){
int dp[matrixSize][*matrixColSize];
int i,j;
for(i=0;i<*matrixColSize;i++){
dp[0][i] = *((int*)matrix+i);
//printf("%d ",dp[0][i]);
}
printf("\n");
for(i=1;i<matrixSize;i++){
for(j=0;j<*matrixColSize;j++){
if(j>=1&&j<*matrixColSize-1){
dp[i][j] = min(min(dp[i-1][j],dp[i-1][j+1]),dp[i-1][j-1])+*((int*)matrix+i*(* matrixColSize)+j);
}
else if(j==0){
dp[i][j] = min(dp[i-1][j],dp[i-1][j+1])+*((int*)matrix+i*(* matrixColSize)+j);
}
else if(j==*matrixColSize-1){
dp[i][j] = min(dp[i-1][j],dp[i-1][j-1])+*((int*)matrix+i*(* matrixColSize)+j);
}
}
}
int minvalue = dp[matrixSize-1][0];
for(i=0;i<*matrixColSize;i++){
minvalue = min(minvalue,dp[matrixSize-1][i]);
}
return minvalue;
}
int main(){
int m[3][3] = {{2,1,3},{6,5,4},{7,8,9}};
int len = 3;
int re = minFallingPathSum((int **)m,3,&len);
printf("re = %d\n",re);
}
leetcode
#define min(a,b) ((a)<(b)?a:b)
int minFallingPathSum(int** matrix, int matrixSize, int* matrixColSize){
int dp[matrixSize][*matrixColSize];
int i,j;
for(i=0;i<*matrixColSize;i++){
dp[0][i] = matrix[0][i];
//printf("%d ",dp[0][i]);
}
for(i=1;i<matrixSize;i++){
for(j=0;j<*matrixColSize;j++){
if(j>=1&&j<*matrixColSize-1){
dp[i][j] = min(min(dp[i-1][j],dp[i-1][j+1]),dp[i-1][j-1])+matrix[i][j];
}
else if(j==0){
dp[i][j] = min(dp[i-1][j],dp[i-1][j+1])+matrix[i][j];
}
else if(j==*matrixColSize-1){
dp[i][j] = min(dp[i-1][j],dp[i-1][j-1])+matrix[i][j];
}
}
}
int minvalue = dp[matrixSize-1][0];
for(i=0;i<*matrixColSize;i++){
minvalue = min(minvalue,dp[matrixSize-1][i]);
}
return minvalue;
}