#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