三步问题
思路:
通过题意很明显就是动态规划问题,而且本问题很简单(是两步楼梯的进阶版),构造动态转换方程为:
\[dp[i] = d[i - 1]+dp[i-2]+dp[i-3] \]解释一下:在第
i
层楼梯,到达这一层的方式可以从第i-1
层上来,也可以在i-2
层上来,也可以从i-3
上来,因此相加即可。初始状态:
dp[0]=0,dp[1]=1,dp[2]=2,dp[3]=4
/** * @param {number} n * @return {number} */ var waysToStep = function(n) { let dp = [n + 1]; dp[0] = 0 dp[1] = 1 dp[2] = 2 dp[3] = 4 for(let i = 4; i <= n; i++){ dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3] dp[i] = dp[i] % 1000000007 } return dp[n] % 1000000007 };
迷路的机器人
标签:10,obstacleGrid,return,金典,number,dfs,---,flag,dp From: https://www.cnblogs.com/dgqp/p/17334646.html思路:
使用深度优先搜索进行解决,递归求解
递归出口:
/** * @param {number[][]} obstacleGrid * @return {number[][]} */ var pathWithObstacles = function(obstacleGrid) { const m = obstacleGrid.length, n = obstacleGrid[0].length; let res = [] // 标记是否成功 let flag = false // 递归函数 const dfs = function(x, y, obstacleGrid){ // 出口 if(x < 0 || x >= m || y >= n || obstacleGrid[x][y] === 1) return // 加入结果 res.push([x, y]) // 标记已读 obstacleGrid[x][y] = 1 // 终点 if(x === m - 1 && y === n - 1) flag = true // 向右走 if(!flag) dfs(x + 1, y, obstacleGrid) // 向左走 if(!flag) dfs(x, y + 1, obstacleGrid) // 结果删除 if(!flag) res.pop() } // 开始 dfs(0, 0, obstacleGrid) return res };