过z个月以后,也就是第z+1个月
分析:
f[i]表示第i月的成虫数目的话
想要找出一个只含有f的递推式是很困难的,
比如f(i) = [f(i - 1) + f(i - 2) + f(i - 3) + … + f(i - x)] * y就是错误的
因为“每对卵要过两个月长成成虫”
添加一个辅助数组e,e[i]表示第i月的卵的数目,从而得到两个公式:
e[i] = f[i - x] * y;
f[i] = f[i - 1] + e[i - 2];
注意初始条件:f[1] ~ f[x] = 1
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
long long a[51]; //保存每个月成虫的对数
long long b[51]; //保存每个月卵的对数
int main()
{
int x,y,z;
cin>>x>>y>>z;
//第1个月到第x个月都只有一对成虫,没有卵
for(int i=1;i<=x;i++)
{
a[i] = 1;
b[i] = 0;
}
for(int i=x+1;i<=z+1;i++)
{
b[i] = a[i-x]*y;
//第i个月卵的对数 等于 x个月以前成虫对数的y倍
a[i] = a[i-1] + b[i-2];
//第i个月成虫的对数 等于 第i-1个月成虫的对数 加上 2个月以前卵的对数
}
cout<<a[z+1]<<endl;
return 0;
}
涉及到数组越界: