zoukankan      html  css  js  c++  java
  • 【openjudge】【递推】例3.4 昆虫繁殖

    【题目描述】

    科学家在热带森林中发现了一种特殊的昆虫,这种昆虫的繁殖能力很强。每对成虫过x个月产y对卵,每对卵要过两个月长成成虫。假设每个成虫不死,第一个月只有一对成虫,且卵长成成虫后的第一个月不产卵(过X个月产卵),问过Z个月以后,共有成虫多少对?0≤X≤20, 1≤Y≤20, X≤Z≤50。

    【输入】

    x,y,z的数值。

    【输出】

    过Z个月以后,共有成虫对数。

    【输入样例】
    
    1 2 8
    【输出样例】
    
    37
    输入输出样例

    【算法分析:】

    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[0] ~ f[x - 1] = 1

    【代码:】

     1 #include<iostream>
     2 #include<cstdio>
     3 using namespace std;
     4 
     5 const long long MAXN = 50 + 1;
     6 
     7 long long x, y, z;
     8 long long f[MAXN], e[MAXN];
     9 
    10 int main() {
    11     scanf("%lld%lld%lld", &x, &y, &z);
    12     for(int i = 0; i < x; i++) f[i] = 1;
    13     for(int i = x; i <= z; i++) {
    14         e[i] = f[i - x] * y;
    15         f[i] = f[i - 1] + e[i - 2];
    16     }
    17     printf("%lld
    ", f[z]);
    18 }
  • 相关阅读:
    DNS服务器配置
    动态网站技术CGI
    SED单行脚本快速参考(Unix 流编辑器)
    xen 安静的角落
    IP命令
    oracle 监听文件 说明
    LRU ,LRUW,CKPT-Q
    重建控制文件ORA-12720
    历史备份控制文件恢复数据库
    增量检查点和完全检查点
  • 原文地址:https://www.cnblogs.com/devilk-sjj/p/9013845.html
Copyright © 2011-2022 走看看