题目
一个人走走了很多年,发现自己走到了一个很长的,年久失修的楼梯面前。年久失修的意思就是,有 k 个台阶坏了,没法走。
楼梯一共有 n 层,你一次能上一阶、两阶或三阶台阶,请问,你从楼梯底部 (0 开始) 走到楼梯顶部,共有多少种走法。
输入格式
输入数据共两行,第一行包含两个自然数 n (1≤n≤100) 和 k (0≤k<n),第二行包含 k 个自然数 Xi (1≤Xi≤n),数字之间用一个空格隔开,表示损坏的台阶的序号(从楼梯底部到楼梯顶部,台阶序号依次为 1 到 n)。
输出格式
输出数据仅包含一个整数,表示所有可行走法的总数。
样例
input
5 2
2 4
output
2
解题思路
动态规划!!!
每次走下一步的时候,计算前三个之和。
*假如楼梯坏了,那么就使得dp[i] = 0
初始值: dp[0] = 1
, dp[1] = 1
, dp[2] = dp[1] + 1
状态转移方程:dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3]
int main(int argc, const char * argv[])
{
int Stairs[110] = {0};
int ans[110] = {0};
int num, brk_num;
cin >> num >> brk_num;
for (int i = 0; i < brk_num; ++i)
{
int brk;
cin >> brk;
Stairs[brk] = -1;
ans[brk] = 0;
} // input
ans[0] = 1;
if (Stairs[1] != -1)
ans[1] = 1;
if(Stairs[2] != -1)
ans[2] = ans[1] + 1;
for (int i = 3; i <= num; i++)
if (Stairs[i] != -1)
ans[i] = ans[i - 1] + ans[i - 2] + ans[i - 3];
cout << ans[num] << endl;
return 0;
}