zoukankan      html  css  js  c++  java
  • 小问题,对递归重复调用的改进,一起来分享


    Problem
    设有一头小母牛,从出生第四年起每年生一头小母牛,按此规律,第N年时有几头母牛?

    Input
    本题有多组数据。每组数据只有一个整数N,独占一行。(1≤N≤50)

    Output
    对每组数据,输出一个整数(独占一行)表示第N年时母牛的数量

    Sample Input
    1
    4
    5
    20

    Sample Output
    1
    2
    3
    872

    ------------------------------------
    最容易写出来的

    解决方法很简单:母牛数等于自己加上它生的小牛数,再加上它的小牛们自己生的小牛,如此递归。


    /*
    此解答未被Accept
    原因:运算时间超时(1200ms,而时间限制在1000ms)
    */
    #include<stdio.h>

    int F(int n)
    {
     int res = n<4?0:n-3;//该母牛所生的小牛数

     if(n>=4)
     {
      for(int i=1; i<=n-3; i++)//该母牛的每一个孩子再生小牛。
      {
       res += F(i);
      }
     }

     return res;
    }

    int main()
    {
     int n;

     while( scanf("%d",&n) != EOF)
     {
      printf("%d\n",F(n)+1);
     }

     return 0;
     
    }

    上面解答的弱点是,重复计算(比如F(1)被。每一个小牛掉用了,被每一个小牛的每一个孩子调用了,如此重复下去),导致时间开销很大。
    ----------------------------
    改进的:

    为了避免重复运算,我们将用一个数组保存已经被计算过的值,由于函数F的任何计算的结果都不会是
    -1,那么我们设置数组的初始值为-1,但检查到其值不为-1时,那么它已经被计算过了,我们就没有必要再计算了。

    /*
    此解答已通过TongJi编译,并接收
     User        Result   Memory Time  Language Date 
     zhouyinhui  Accepted 56 k   2ms   C++      2006-05-06 16:32:02
    */
     
    #include<stdio.h>
    #include<malloc.h>

    int* arr;//用于保存运算结果,避免递归调用中的重复运算

    int F(int n)
    {
     int res = n<4?0:n-3;

     if(n>=4)
     {
      
      for(int i=1; i<=n-3; i++)
      {
       if( *(arr+i) == -1 )//如果未运算该F(i)
       {
        *(arr+i) = F(i);//则运算并保存结果
       }
       res += *(arr+i);  

      }
      
     }

     return res;
    }

    int main()
    {
     int n;

     while( scanf("%d",&n) != EOF)
     {
      int *array = (int *)malloc(n*4);
      for(int i=0; i<n; i++)
      {
       *(array+i) = -1;
      }

      arr = array;

      printf("%d\n",F(n)+1);
     }

     return 0;
     
    }





     

  • 相关阅读:
    Codeforces Round #461 (Div. 2)B-Magic Forest+位运算或优雅的暴力
    动态规划:树形DP
    动态规划:划分DP
    动态规划:状压DP
    图论:树的直径
    图论:点分治
    图论:2-SAT
    数据结构&图论:K短路-可持久化可并堆
    图论:次短路
    图论:曼哈顿距离最小生成树
  • 原文地址:https://www.cnblogs.com/zhouyinhui/p/392719.html
Copyright © 2011-2022 走看看