给你有一个 非负 整数 k
。有一个无限长度的台阶,最低 一层编号为 0 。
Alice 有一个整数 jump
,一开始值为 0 。Alice 从台阶 1 开始,可以使用 任意 次操作,目标是到达第 k
级台阶。假设 Alice 位于台阶 i
,一次 操作 中,Alice 可以:
- 向下走一级到
i - 1
,但该操作 不能 连续使用,如果在台阶第 0 级也不能使用。 - 向上走到台阶
i + 2jump
处,然后jump
变为jump + 1
。
请你返回 Alice 到达台阶 k
处的总方案数。
注意,Alice 可能到达台阶 k
处后,通过一些操作重新回到台阶 k
处,这视为不同的方案。
class Solution {
public:
int waysToReachStair(int k) {
unordered_map<long long,int> memo;
auto dfs = [&](auto &&dfs,int i,int j,bool pre_down)->int{
if(i>k+1) return 0;
long long mask=(long long)i<<32|j<<1|pre_down;
if(memo.contains(mask)) return memo[mask];
int res = i == k;
res+=dfs(dfs,i+(1<<j),j+1,false);//2
if(i&&!pre_down)
res+=dfs(dfs,i-1,j,true);
return memo[mask]=res;
};
return dfs(dfs,1,0,false);
}
};