给定一个包含非负整数的 M x N 迷宫,请找出一条从左上角到右下角的路径,使得路径上的数字总和最小。每次只能向下或者向右移动一步。
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 256M,其他语言512M
输入描述:
第一行包含两个整数M和N,以空格隔开,1≤N≤10,1≤N≤10。
接下来的M行中,每行包含N个数字 。
输出描述:
找出总和最小的路径,输出路径上的数字总和。
示例1
输入例子:
3 3 1 3 1 1 5 1 4 2 1
输出例子:
7
代码:
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void (async function () {
// Write your code here
let tokens = [];
while ((line = await readline())) {
tokens.push(line);
}
let length = tokens[0].split(" ").map(Number);
let array = [];
var i, j;
for (i = 1; i <= length[0]; i++) {
array.push([]);
let arr = tokens[i].split(" ").map(Number);
for (j = 0; j < length[1]; j++) {
array[i - 1].push(arr[j]);
}
}
let dp = [];
for (i = 0; i < length[0]; i++) {
dp.push([])
for (j = 0; j < length[1]; j++) {
if (i == 0 && j == 0) {
dp[i].push(array[0][0]);
continue;
}
if (i == 0) {
dp[i].push(dp[i][j - 1] + array[i][j]);
} else if (j == 0) {
dp[i].push(dp[i - 1][j] + array[i][j]);
} else {
dp[i].push(Math.min(
dp[i - 1][j] + array[i][j],
dp[i][j - 1] + array[i][j]
));
}
}
}
console.log(dp[i-1][j-1])
})();