C++-蝴蝶繁殖(变态斐波拉且数列)问题解题思路

【Horn Studio】编程专栏:C++-蝴蝶繁殖(变态斐波拉且数列)问题

题目描述

在一个神秘的森林中某种蝴蝶化茧成蝶繁殖的过程为:
每对蝴蝶过x个月产y对卵,每对卵要过两个月长成蝴蝶。
假设每个蝴蝶都不死的情况下,第一个月只有一对蝴蝶,且卵长成蝴蝶后的第一个月不产卵(过x个月产卵),问过z个月以后,共有多少对蝴蝶?

输入

x,y,z的数值

输出

过z个月以后,共有多少对蝴蝶。

样例输入 

1 2 8

样例输出 

37
 
从这道题我们可以看出来这一道题是一道变态型斐波拉且数列(很重要!),同样是一道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;
}

 

 

 

 

posted @ 2022-02-20 13:37  冯子坤  阅读(118)  评论(0编辑  收藏  举报