「C++」简单递推:你以为它很简单,其实它并不难

这是一个公式:

\[a_{i-1} + a_{i-4} = a_{i} \]

这个公式初看没有什么特别的,但是再看,就可以发现这是一个递推公式,通过这个公式,我们可以简单的写出求第n项的代码:

#include<bits/stdc++.h>
using namespace std;
long long a[110];
int main() {
    a[1] = 1, a[2] = 2, a[3] = 3, a[4] = 4, a[5] = 5; // 为了递推初始化前面5项
    for(int i = 6; i <= 100; ++ i) {
        a[i] = a[i - 1] + a[i - 4];   
    }
    while(true) {
        int n;
        cin >> n;
        if(n == 0) break;
        else cout << a[n] << "\n";
    }
    return 0;
}

注意,这个代码是求n小于等于100时的情况,n在这个情况下如果很大就会爆int,所以我们的数组要定义成long long。

根据公式来推,这不就是纯纯的小模拟吗?但是如果给它伪装到一个题目里面去,你还能发现这个公式吗?

Q1:繁衍

题目背景

正所谓一生二,二生三,三生万物,你作为造物主创造了一种全新的物种,这种生物为胎生动物,一年生一只,新生的从第五个年头开始,每年年初也生一只。请问第N年该生物数量。

输入格式

多组输入,每组输入占一行,一行一个数字N表示第N年(0<N<=100),当N=0时表示输入结束不做处理。

输出格式

对于每组数据输出第N年该生物数量,每组输出占一行。

输入输出样例

输入

1
2
3
4
5
6
0

输出 #1

1
2
3
4
5
7

提示

第一年就一个第一年刚被创造没生,第二年生了一个,第三年也生了一个以次类推,一直到第6年,第二年出生的那个已经长了4年第六年是他出生第五年所以生了一个加起来第六年是7个。

image

分析

现在就可以告诉你了,这一道题的代码就是上面的代码,公式也是上面的公式,可是问题来了,为什么这道题用的是上面的公式呢?This is a good problem.

表格上面已经给出了a[1]到a[5]的值(a[0]舍弃的情况下),我们可以根据题目的描述和已经给出的条件来推理。

首先,我们已知每一个胎生动物长到5岁时就开始无限生娃(具体无不无限咱也不知道),这里a[i-1]就是去年这种动物的数量,而a[i-4]就是五年前,也就是第i年可以繁殖的生物的数量,将他们相加起来就是简单这种生物第i年的数量。

代码略。

OK,这篇博客很短,因为递推这个东西,简单的时候你以为它很简单,其实它并不难。

posted @ 2024-06-26 16:59  Charzie  阅读(11)  评论(0编辑  收藏  举报