#include <stdio.h>
#define MAX_ROWS 1000
#define MAX_COLS 1000
int min(int a, int b) {
return a < b ? a : b;
}
int minPathSum(int m, int n, int matrix[MAX_ROWS][MAX_COLS]) {
int dp[MAX_ROWS][MAX_COLS];
// 初始化边界条件
dp[0][0] = matrix[0][0];
for (int i = 1; i < m; i++) {
dp[i][0] = dp[i - 1][0] + matrix[i][0];
}
for (int j = 1; j < n; j++) {
dp[0][j] = dp[0][j - 1] + matrix[0][j];
}
// 动态规划计算路径和
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
dp[i][j] = matrix[i][j] + min(dp[i - 1][j], dp[i][j - 1]);
}
}
return dp[m - 1][n - 1];
}
int main() {
int m, n;
scanf("%d %d", &m, &n);
int matrix[MAX_ROWS][MAX_COLS];
// 读取矩阵
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &matrix[i][j]);
}
}
// 计算最小路径和并输出
printf("%d\n", minPathSum(m, n, matrix));
return 0;
}