方格巡游

题目描述

你被困在一个宽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;
} 
posted @ 2020-07-23 16:15  牛大了的牛大  阅读(135)  评论(0编辑  收藏  举报