#include <bits/stdc++.h>
using namespace std;
const int N = 520;
/*
每个位置的最小路径和肯定是从最小的左边或者上面转移过来的,所以有dp[i][j] += min(dp[i-1][j],dp[i][j-1]);
但是有特殊情况就是在第一行的时候,所以特判
if(i==1) dp[i][j] += dp[i][j-1],最后dp[n][m]就是答案
else if(j==1) dp[i][j] += dp[i-1][j];
*/
int n,m,dp[N][N];
int main(){
cin>>n>>m;
for(int i = 1;i<=n;i++){
for(int j = 1;j<=m;j++){
cin>>dp[i][j];
}
}
for(int i = 1;i<=n;i++){
for(int j = 1;j<=m;j++){
if(i==1) dp[i][j] += dp[i][j-1];
else if(j==1) dp[i][j] += dp[i-1][j];
else dp[i][j] += min(dp[i-1][j],dp[i][j-1]);
}
}
cout<<dp[n][m];
return 0;
}
#牛客春招刷题训练营#https://www.nowcoder.com/discuss/727521113110073344

京公网安备 11010502036488号