题目描述
你被困在一个宽N格,长M格的方阵中。现在,你需要从第(1,1)格移动到(N,M)格。每个格子有一个价格Cij,代表经过这个格子需要付出的代价。数据保证起点及终点的代价为0。每次移动可以从当前格子移动到上、下、左、右四个相邻的格子(如果有的话)。现在问题来了:从第(1,1)
输入格式
第1行包含2个正整数N,M。
接下来一个N*M的方阵,代表每个方格通过的代价。
输出格式
一个整数:从第(1,1)格移动到(N,M)格的最小代价。
输入样例
2 3
0 1
2 1
2 0
输出样例
2
数据范围
30%的数据保证1≤N*M≤10.
100%的数据保证1≤N,M≤100。
代码
#include <bits/stdc++.h>
using namespace std;
int n, m, a[101][101], dp[101][101];
int main() {
scanf("%d %d", &n, &m);
for (register int i = 1; i <= n; i++) {
for (register int j = 1; j <= m; j ++) {
scanf("%d", &a[i][j]);
}
}
memset(dp, 0, sizeof(dp));
dp[1][1] = 0;
for (register int i = 1; i <= n;i++) {
for (register int j = 2; j <= m; j++){
dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + a[i][j];
}
}
cout << dp[n][m] << endl;
return 0;
}