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

思路:还是由最后一步得到,三种状态Right, left, stay三种状态最后一步得到最后status,i表示index,remain代表还剩下多少步,memo[i][j] 代表的是index为i的情况下,我还有remain步的情况下,总共可能的情况有多少种。如果,index > remainstep,肯定回不来直接return 0;base case是index == 0, remainstep == 0, return 1;

class Solution {
    int MOD = 1000000007;
    public int numWays(int steps, int arrLen) {
        long[][] cache = new long[steps + 1][steps + 1];
        return (int)dfs(cache, 0, steps, arrLen);
    }
    
    private long dfs(long[][] cache, int index, int remain, int arrLen) {
        // 一定不要忘记,i == 0, remain == 0的时候,返回1,代表就这一种状态;不用走了
        if(index == 0 && remain == 0) {
            return 1;
        }
        if(index < 0 || index >= arrLen || index > remain || remain < 0) {
            return 0;
        }
        if(cache[index][remain] != 0) {
            return cache[index][remain];
        }
        long value = 0;
        value = (dfs(cache, index + 1, remain - 1, arrLen) % MOD +
                dfs(cache, index, remain - 1, arrLen) % MOD +
                dfs(cache, index - 1, remain - 1, arrLen) % MOD ) % MOD;
        cache[index][remain] = value;
        return cache[index][remain];
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值