Leetcode--5274. 停在原地的方案数
有一個長度為?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
思路:動態規劃
x表示當前允許走的步數,pos表示當前所處的位置
dp(x,pos)的值只能由三種方法得到,左邊那個位置右移一步,右邊那個位置左移一步,當前點不動一下
dp(x,pos)=dp(x?1,pos?1)+dp(x?1,pos)+dp(x?1,pos+1)
提交的代碼:
class?Solution?{
????public?int?numWays(int?steps,?int?arrLen)?{
????????int?i,j;
??????int?MOD?=?1000000007;
????????????int?dp[][]?=?new?int[steps+1][steps+1];?
/*為什么列長還是steps+1,題上有一個案例的位置給的特別長,會超出內存限制,? 但其實想一下,最遠的距離不就是你能走的步數總長嗎,總共讓你走10步,還能跑到20位置嗎?不可能的*/
????????????dp[0][0]=1;
????????????for(i=1;i<=steps;i++)
????????????{
????????????????for(j=0;j<=Math.min(i,arrLen-1);j++)
????????????????{
????????????????????dp[i][j]+=dp[i-1][j];
????????????????????if(j>0)
????????????????????{
????????????????????????dp[i][j]+=dp[i-1][j-1];
????????????????????????dp[i][j]%=MOD;
????????????????????}
????????????????????if(j<Math.min(i,arrLen-1))
????????????????????{
????????????????????????dp[i][j]+=dp[i-1][j+1];
????????????????????????dp[i][j]%=MOD;
????????????????????}
????????????????}
????????????}
????????????return?dp[steps][0];
????}
}
總結
以上是生活随笔為你收集整理的Leetcode--5274. 停在原地的方案数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【剑指offer】面试题42:连续子数组
- 下一篇: Leetcode--289. 生命游戏