C++-蝴蝶繁殖(变态斐波拉且数列)问题解题思路
【Horn Studio】编程专栏:C++-蝴蝶繁殖(变态斐波拉且数列)问题
题目描述
在一个神秘的森林中某种蝴蝶化茧成蝶繁殖的过程为:
每对蝴蝶过x个月产y对卵,每对卵要过两个月长成蝴蝶。
假设每个蝴蝶都不死的情况下,第一个月只有一对蝴蝶,且卵长成蝴蝶后的第一个月不产卵(过x个月产卵),问过z个月以后,共有多少对蝴蝶?
输入
x,y,z的数值
输出
过z个月以后,共有多少对蝴蝶。
从这道题我们可以看出来这一道题是一道变态型斐波拉且数列(很重要!),同样是一道DP型题目,但也不是一道很简单的题目,首先我们先要搞清怎么做,提示:0=<x<=20,1<=y<=20,x=<z<=50,这说明我们并不用考虑大数越界的风险,这里的dp方程有两个,分别是
a[i] = a[i - 1] + b[i - 2];//斐波拉且方式相加 b[i] = a[i - x] * y;//i-月份*卵对数
对于初始化,我们还需要:
for (int i = 0; i < x; ++i) { a[i] = 1;//初始化为1 }
至此,整个代码就可以算完了,加头加尾变完事!
显出完整代码:
#i n c l u d e <b i t s / s t d c + + . h> u s i n g n a m e s p a c e s t d; int x, y, z; long long a[55], b[55]; //禁止盗用! int main() { cin >> x >> y >> z; for (int i = 0; i < x; ++i) { a[i] = 1; } for (int i = x; i <= z; ++i) { a[i] = a[i - 1] + b[i - 2]; b[i] = a[i - x] * y; } cout << a[z]; return 0; }