不多说,直接上题
1、不同路径
/**
* @param {number} m
* @param {number} n
* @return {number}
*/
var uniquePaths = function(m, n) {
let dp = new Array(m)
for(let i = 0; i < dp.length; i++) {
dp[i] = new Array(n).fill(1)
}
for(let i = 1; i < dp.length; i++) {
for(let j = 1; j < dp[0].length; j++) {
dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
}
}
return dp[m - 1][n - 1]
};
2、不同路径 II
/**
* @param {number[][]} obstacleGrid
* @return {number}
*/
var uniquePathsWithObstacles = function(obstacleGrid) {
let dp = new Array(obstacleGrid.length)
for(let i = 0; i < dp.length; i++) {
dp[i] = new Array(obstacleGrid[0].length).fill(0)
}
dp[0][0] = obstacleGrid[0][0] === 1 ? 0 : 1
for(let i = 1; i < dp.length; i++) {
dp[i][0] = obstacleGrid[i][0] === 0 ? dp[i - 1][0] : 0
}
for(let i = 1; i < dp[0].length; i++) {
dp[0][i] = obstacleGrid[0][i] === 0 ? dp[0][i - 1] : 0
}
for(let i = 1; i < dp.length; i++) {
for(let j = 1; j < dp[0].length; j++) {
if(obstacleGrid[i][j] === 0) {
let top = obstacleGrid[i - 1][j] === 1 ? 0 : dp[i - 1][j]
let left = obstacleGrid[i][j - 1] === 1 ? 0 : dp[i][j - 1]
dp[i][j] = top + left
}
}
}
return dp[obstacleGrid.length - 1][obstacleGrid[0].length - 1]
};
3、地下城游戏
/**
* @param {number[][]} dungeon
* @return {number}
*/
var calculateMinimumHP = function(dungeon) {
let row = dungeon.length, col = dungeon[0].length
let dp = new Array(row)
for(let i = 0; i < row; i++) {
dp[i] = new Array(col).fill(0)
}
// 变为0是重点
dp[row - 1][col - 1] = dungeon[row - 1][col - 1] > 0 ? 0 : dungeon[row - 1][col - 1]
for(let i = row - 2; i >= 0; i--) {
dp[i][col - 1] = dungeon[i][col - 1] + dp[i + 1][col - 1]
// 重点
dp[i][col - 1] = dp[i][col - 1] > 0 ? 0 : dp[i][col - 1]
}
for(let i = col - 2; i >= 0; i--) {
dp[row - 1][i] = dungeon[row - 1][i] + dp[row - 1][i + 1]
// 重点
dp[row - 1][i] = dp[row - 1][i] > 0 ? 0 : dp[row - 1][i]
}
for(let i = row - 2; i >= 0; i--) {
for(let j = col - 2; j >= 0; j--) {
dp[i][j] = Math.max(dp[i + 1][j], dp[i][j + 1]) + dungeon[i][j]
dp[i][j] = dp[i][j] > 0 ? 0 : dp[i][j]
}
}
// 因为最开始必定是1以上才行
return dp[0][0] === 0 ? 1 : Math.abs(dp[0][0]) + 1
};