解题思路
这道题和之前ACM选拔的“上楼梯”一题很相似,不同的是有了障碍物,而且不止可以一次走1步或2步,还可以3步,除此之外基本和“上楼梯”一样,解法也大同小异。
如果要到第 i 个点,那前一步肯定是到第(i - 1)、(i - 2)或(i - 3)个点,因此到第 i 个点的方法数即为到这三点的方法数之和。
代码
#include <iostream>
#include <string>
#define M 1000000007
using namespace std;
int a[1000000];
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
if (a[0])
{
a[0] = 0;
}
else
{
a[0] = 1;
}
if (a[1])
{
a[1] = 0;
}
else
{
a[1] = a[0] + 1;
}
if (a[2])
{
a[2] = 0;
}
else
{
a[2] = a[0] + a[1] + 1;
}
for (int i = 3; i < n; i++)
{
if (a[i])
{
a[i] = 0;
}
else
{
a[i] = ((a[i - 1] + a[i - 2]) % M + a[i - 3]) % M;
}
}
if (a[n - 1])
{
cout << a[n - 1] << endl;
}
else
{
cout << "No Way!" << endl;
}
return 0;
}
类似题