// 暴力递归 classSolution { public: intway(int N, int M, int K, int P){ if (N < 2 || K < 1 || M < 1 || M > N || P < 1 || P > N) { return0; } returnwalk(N, M, K, P); }
private: intwalk(int N, int cur, int rest, int p){ if (rest == 0) { return cur == p ? 1 : 0; } if (cur == 1) { returnwalk(N, 2, rest-1, p); } if (cur == N) { returnwalk(N, N-1, rest-1, p); } returnwalk(N, cur-1, rest-1, p) + walk(N, cur+1, rest-1, p); } };
2. 动态规划
如上的暴力递归方案可以改成动态规划,我们发现递归函数的参数中 N 和 P 都是不变的。只有 cur 和 rest 在变化。我们去掉那些不变的参数,只用变化的参数来推演 walk 函数,我们发现满足如下条件: