AlvinZH去图书馆
时间限制:500ms 内存限制:32768kb
通过率:50/110 (45.45%)
正确率:50/321 (15.58%)
解析:
动态规划。
把跳一步或两步和跳三步的过程分开看,用两个数组a,b记录。a[i]表示当前步的方法数是上一步的方法数与上上步的方法数之和,即a[i] = a[i-1] + a[i-2] + b[i-1] + b[i-2]。b[i]表示当前步的方法数是此步的前三步的方法数,即b[i] = a[i-3](注意不能连续跨两个三步,会扯蛋)。
初始化:a[1] = 1;a[2] = 2;a[3] = 3;b[1] = 0;b[2] = 0; b[3] = 1。
状态转移方程:a[i] = a[i-1] + a[i-2] + b[i-1] + b[i-2];b[i] = a[i-3]。
(注意最后输出a[n]+b[n])
代码:
#include<cstdio>
#define maxn 57
long long a[maxn],b[maxn];
void init()
{
a[1] = 1;
a[2] = 2;
a[3] = 3;
b[1] = 0;
b[2] = 0;
b[3] = 1;
}
int main()
{
int n;
init();
for(int i = 4;i <= 50;i++)
{
a[i] = a[i-1] + a[i-2] + b[i-1] + b[i-2];
b[i] = a[i-3];
}
while(~scanf("%d",&n))
{
printf("%lld\n",a[n]+b[n]);
}
}