1. 程式人生 > 實用技巧 >方格巡遊

方格巡遊

題目描述

你被困在一個寬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;
}