- 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];
}
};