LeetCode全集请参考:LeetCode Github 大全

题目

1269. Number of Ways to Stay in the Same Place After Some Steps

You have a pointer at index 0 in an array of size arrLen. At each step, you can move 1 position to the left, 1 position to the right in the array or stay in the same place (The pointer should not be placed outside the array at any time).

Given two integers steps and arrLen, return the number of ways such that your pointer still at index 0 after exactly steps steps.

Since the answer may be too large, return it modulo 10^9 + 7.

Example 1:

Input: steps = 3, arrLen = 2
Output: 4
Explanation: There are 4 differents ways to stay at index 0 after 3 steps.
Right, Left, Stay
Stay, Right, Left
Right, Stay, Left
Stay, Stay, Stay

Example 2:

Input: steps = 2, arrLen = 4
Output: 2
Explanation: There are 2 differents ways to stay at index 0 after 2 steps
Right, Left
Stay, Stay

Example 3:

Input: steps = 4, arrLen = 2
Output: 8

Constraints:

1 <= steps <= 500
1 <= arrLen <= 10^6

回溯递归解决

分析:移动的三种方案可以转换为数字右移+1,不动0,左移-1。 很容易就想到用回溯递归的方式解决。退出的条件有两个:

  1. 步数用完steps == 0 ,如果位置为0则表示一种方案,返回1,否则表示不符合要求,返回0;
  2. 超过边界sum < 0 || sum >= arrLen,实际上还有优化的空间最大步数不超过steps的一半,或者arrLen。Math.min(steps/2 + 1, arrLen)
public int numWays(int steps, int arrLen) {return helper(steps, arrLen, 0);}private int helper(int steps, int arrLen, int sum) {// check edgeif (sum < 0 || sum >= arrLen) {return 0;}// exitif (steps == 0) {return sum == 0 ? 1 : 0;}int next = steps - 1;return helper(next, arrLen, sum + 1) + helper(next, arrLen, sum) + helper(next, arrLen, sum - 1);}

这里不考虑时间复杂度,可以解决问题,在LeetCode提交会超时。

动态规划

如果我们将dp状态选择为dp[steps][position],则可以从该状态选择:

  • 不动。然后我们消耗一步,并停留在同一位置=>dp[steps-1][position]
  • 向右走。然后,我们走了一步,然后向右走=>dp[steps-1][position+1]
  • 向左走(如果不在零位置)。然后我们消耗一步,然后向左走=>if position > 0 then dp[steps-1][position-1]

然后我们的状态可以计算为:dp[steps][position] = dp[steps-1][position] + dp[steps-1][position+1] + dp[steps-1][position-1]

当只有一步作为基本案例时,我们可以使用该案例。这些情况是:

  • 我们处于零位,只有一步,那么只有一种方法(停留)=> dp[1][0] = 1
  • 我们处于第一位置,只有一步,然后只有一种方法(向左走)=> dp[1][1] = 1

请注意,我们只能进行尽可能多的步骤。例如,对于500步,我们只能到达第500个位置,而arrLen是否为99999999则无关紧要。因此,我们使用它来避免内存/时间限制。min(steps,arrLen)

public int numWaysWithDP(int steps, int arrLen) {//int MOD = 1000_000_007;final int MOD = (int)1e9 + 7;int maxPos = Math.min(steps / 2 + 1, arrLen);long[][] dp = new long[steps + 1][maxPos + 1];dp[1][0] = 1;dp[1][1] = 1;for (int i = 2; i <= steps; i++) {for (int k = 0; k < maxPos; k++) {dp[i][k] = (dp[i - 1][k] + dp[i - 1][k + 1] + (k > 0 ? dp[i - 1][k - 1] : 0)) % MOD;}}return (int) dp[steps][0];}

算法:回溯和动态规划解决每次移动一步最终回到原地1269. Number of Ways to Stay in the Same Place After Some Steps相关推荐

  1. 贪心算法+回溯算法+动态规划

    一.贪心算法 1.分饼干问题 #思路:排序加贪心 先让胃口小的孩子满足 class Solution:def findContentChildren(self, g, s):print('==g:', ...

  2. 五大常用算法一(回溯,随机化,动态规划)

    五大常用算法一(回溯,随机化,动态规划) 回溯算法 回溯法: 也称为试探法,它并不考虑问题规模的大小,而是从问题的最明显的最小规模开始逐步求解出可能的答案,并以此慢慢地扩大问题规模,迭代地逼近最终问题 ...

  3. c++矩阵连乘的动态规划算法并输出_「Javascript算法设计」× 动态规划与回溯算法...

    目录: 分而治之算法 动态规划 回溯算法 分而治之算法 分而治之算法是算法设计的一种方式,它将一个问题分成多个和原问题相似的小问题,递归解决小问题,再将解决方式合并以解决原来的问题(例如快速排序,二分 ...

  4. 【数据结构与算法】【算法思想】【联系与区别】回溯 贪心 动态规划 分治

    4种算法思想比较与联系 如果将贪心,分治,回溯和动态规划四种算法思想分类,那贪心,回溯,动态规划可归为一类,而分治单独可以作为一类,因为它跟其他是三个都不大一样. 因为前三个算法解决问题的模型,都可以 ...

  5. 【算法】【动态规划篇】第3节:数字三角形问题

    本期任务:介绍算法中关于动态规划思想的几个经典问题 [算法][动态规划篇]第1节:0-1背包问题 [算法][动态规划篇]第2节:数字矩阵问题 [算法][动态规划篇]第3节:数字三角形问题 [算法][动 ...

  6. 【算法】【动态规划篇】第5节:剪绳子问题

    本期任务:介绍算法中关于动态规划思想的几个经典问题 [算法][动态规划篇]第1节:0-1背包问题 [算法][动态规划篇]第2节:数字矩阵问题 [算法][动态规划篇]第3节:数字三角形问题 [算法][动 ...

  7. 三十四、动态规划解决01背包问题

    一.动态规划算法介绍 动态规划算法的核心思想是:将大问题划分为小问题进行解决,从而一步一步获取最优解的处理算法. 动态规划算法与分治算法类似,其基本思想是将待求解的问题分解成若干个子问题,先求子问题, ...

  8. 动态规划算法php,php算法学习之动态规划

    动态规划程序设计是对解最优化问题的一种途径.一种方法,最终问题的最优解可以通过前面子问题的最优解推导出来.下面小编为大家整理了,希望能帮到大家! 对于动态规划这个算法,自己学习的还不是很透彻,简单的总 ...

  9. 【数据结构与算法】【算法思想】动态规划

    贪心算法 回溯算法 分治算法 动态规划 贪心:一条路走到黑,就一次机会,只能哪边看着顺眼走哪边 回溯:一条路走到黑,无数次重来的机会,还怕我走不出来 (Snapshot View) 动态规划:拥有上帝 ...

  10. 五大算法之二--动态规划

    动态规划--简单的理解 这个算法简单的来讲就是采用自底向上的方式递推求值,将待求解的问题分解成若干个子问题,先求解子问题,并把子问题的解存储起来以便以后用来计算所需要求的解.简言之,动态规划的基本思想 ...

最新文章

  1. winxp 连接linux ftp,Linux和XP之间使用FTP互传文件
  2. OpenCV2和3的下载、安装和配置
  3. 第2周个人作业:WordCount
  4. string的find和find_first_of的区别
  5. 商城客户细分数据(kaggle)
  6. jquery 获取id最大的元素_超全整理!JQuery中的选择器集合
  7. Product文本格式说明
  8. 本期期刊主题:ASP.NET技术与JavaScript技巧,包括控件等
  9. 土地利用转移矩阵图怎么做_土地利用转移矩阵的几种实现方法
  10. 【转载】AssetBundle资源打包加载管理
  11. MySQL批量插入和单条插入的性能
  12. 运用Doolitle分解法解线性方程组
  13. 记一次蓝牙音箱无声音的原因
  14. CodeForces 1037E Trips(瞎搞)
  15. 将谷歌插件打包给别人使用
  16. excel公式不自动计算_Excel自动计算怎么设置
  17. oracle 取系统当前年份_Oracle 之 获取当前日期及日期格式化
  18. JavaScript中的对象的属性名和属性值
  19. 重定向 return redirect:/user/index;
  20. 如何在一个jsp页面中弹出另一个jsp页面

热门文章

  1. springboot开发者工具包,自动监听内容改变,自动更新重启
  2. oracle 获取awk报告,Oracle 使用 ass.awk 工具查看 system state dump 说明
  3. r语言 rgl 强制过程中_R语言中的方差分析方法汇总
  4. linux查看行数命令 set,Linux显示文件行数之nl命令详解
  5. [HNOI2016]树
  6. 20.6. TeXstudio(LaTeX 编辑器)
  7. Map 3D 2012定制和应用程序开发Webcast将于明天(6月23号)进行
  8. Js字符串与十六进制的相互转换 【转】
  9. SCCM 2007 R7使用手记
  10. PHPCMS2008调用Uchome系统[空间之星]GET语句