Vison's Blog
所有文章
文章总览
编辑器
Publications
About Me
Search
目录
#toc-container
下载Markdown文件
【5.13】LeetCode每日一题· 停在原地的方案数
2021年05月13日 10时15分
标签:
LeetCode
动态规划
## 题目描述 有一个长度为 arrLen 的数组,开始有一个指针在索引 0 处。 每一步操作中,你可以将指针向左或向右移动`1`步,或者停在原地(指针不能被移动到数组范围外)。 给你两个整数`steps`和`arrLen`,请你计算并返回:在恰好执行`steps`次操作以后,指针仍然指向索引`0`处的方案数。 由于答案可能会很大,请返回方案数**模 10^9 + 7**后的结果。 #### 示例1 ``` 输入:steps = 3, arrLen = 2 输出:4 解释:3 步后,总共有 4 种不同的方法可以停在索引 0 处。 向右,向左,不动 不动,向右,向左 向右,不动,向左 不动,不动,不动 ``` #### 示例2 ``` 输入:steps = 2, arrLen = 4 输出:2 解释:2 步后,总共有 2 种不同的方法可以停在索引 0 处。 向右,向左 不动,不动 ``` #### 示例3 ``` 输入:steps = 4, arrLen = 2 输出:8 ``` #### 提示 ``` 1 <= steps <= 500 1 <= arrLen <= 10^6 ``` #### 来源 > 来源:力扣(LeetCode) > 链接:[题目链接](https://leetcode-cn.com/problems/number-of-ways-to-stay-in-the-same-place-after-some-steps%0A) ## 解题思路 虚假的Hard难度,一个简单dp。注意最多只能走step步,因此能够走到的最远位置为`min(step, arrLen-1)`。 ## 代码 ```cpp class Solution { public: // dp[i][j] := 移动i步后,停在j位置的方案数 // dp[i][j] = dp[i-1][j-1] + dp[i-1][j] + dp[i-1][j+1]; const int MOD = 1e9+7; int numWays(int steps, int arrLen) { const int len = min(steps, arrLen - 1); int dp[steps+1][steps+1]; memset(dp, 0, sizeof(dp)); dp[0][0] = 1; for(int i = 1; i <= steps; i++){ for(int j = 0; j <= len; j++){ if(j-1>=0) dp[i][j] = dp[i-1][j-1]; dp[i][j] = (dp[i][j] + dp[i-1][j]) % MOD; if(j+1 <= len) dp[i][j] = (dp[i][j] + dp[i-1][j+1]) % MOD; } } return dp[steps][0]; } }; ``` ## 用时和内存 > 执行用时:20 ms,在所有 C++提交中击败了70.34%的用户 > 内存消耗:6.9 MB,在所有 C++提交中击败了64.41%的用户
所有评论
暂无评论
新增评论
评论
邮箱
邮箱仅作验证使用
图形验证码
邮箱验证码
发送验证码
发表评论
所有评论
暂无评论