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

  • Recursive λ°©μ‹μœΌλ‘œ 풀어보렀고 ν–ˆλŠ”λ° time exceeded둜 μ‹€νŒ¨.
  • λ¨Όμ € μ œμ•½ 쑰건에 λŒ€ν•œ λΆ€λΆ„.
    • position 0으둜 λŒμ•„μ˜€λ €λ©΄ left, right step의 μˆ«μžλŠ” κ°™μ•„μ•Ό ν•œλ‹€.
    • λ”°λΌμ„œ μ΅œλŒ€ 이동 κ°€λŠ₯ν•œ μœ„μΉ˜ maxPos λŠ” step / 2 λ˜λŠ” array 끝 λΆ€λΆ„ arrLen - 1에 ν•΄λ‹Ήλœλ‹€.
  • DP의 점화식은 μ•„λž˜μ™€ κ°™λ‹€.
    • ν˜„μž¬ μœ„μΉ˜λ₯Ό i, step 수λ₯Ό s 라고 ν•  λ•Œ
    • ν˜„μž¬ μœ„μΉ˜ i μ—μ„œ stay ν•˜λŠ” 경우 dp[i][s - 1]
    • 이전 μœ„μΉ˜ i - 1 μ—μ„œ 였λ₯Έμͺ½μœΌλ‘œ μ΄λ™ν•œ 경우 dp[i - 1][s - 1] (단, i > 0)
    • λ‹€μŒ μœ„μΉ˜μ—μ„œ μ™Όμͺ½μœΌλ‘œ μ΄λ™ν•œ 경우 dp[i + 1][s - 1] (단, i ≀ maxPos)
  • μ ν™”μ‹μ—μ„œ 이전 step 숫자의 값듀을 μ°Έμ‘°ν•˜λ―€λ‘œ outer loopλŠ” step 수, inner loopλŠ” μœ„μΉ˜λ‘œ ν•œλ‹€.
class Solution { public: static constexpr int MOD = 1e9 + 7; int numWays(int steps, int arrLen) { int maxPos = min(steps / 2, arrLen - 1); vector<vector<int>> dp(maxPos + 1, vector<int>(steps + 1, 0)); dp[0][0] = 1; for (int s = 1; s <= steps; ++s) { for (int i = 0; i <= maxPos; ++i) { int value = dp[i][s - 1]; if (i > 0) { value = (value + dp[i - 1][s - 1]) % MOD; } if (i < maxPos) { value = (value + dp[i + 1][s - 1]) % MOD; } dp[i][s] = value; } } return dp[0][steps]; } };