zoukankan      html  css  js  c++  java
  • 函数 记忆化搜索模型

    问题描述:

    计算ackerman函数值:

    Ack(m,n)

    if(m==0) n+1;

    if(n==0) ack(m-1,1)

     if(m&&n>0) ack((m-1),ack(m,n-1))

    输入格式:

    从文件ackerman.in读入数据,第一行为两个数,即M和N,其中0<=M<=3,0<=N<=11。

     

    输出格式:

    向文件ackerman.out输出ack(m,n)的值。

     

    样例1:

    ackerman.in

    ackerman.out

    0 1


    2


     

    说明:有极限数据,用朴素递归算法只得36分

    提示:ackerman函数的增长是很惊人的,在我们想象得到的函数值中,m远小于10

    用f[I,j]保存函数值时,j可能很大。

    在分析并查集的算法复杂度时曾提到:采用路径压缩后,每一次查询所用的时间复杂度为增长极为缓慢的ackerman函数的反函数——α(x)。对于可以想象到的n,α(n)都是在5之内的。

    #include<cstdio>
    using namespace std;
    int a[10000][10000];
    int ack(int m,int n){
        if(a[m][n]!=0){
            return a[m][n];
        }
        if(m==0){
            return a[m][n]=n+1;
        }
        if(n==0){
            return a[m-1][1]=ack(m-1,1);
        }
        if(m>0&&n>0){
            return ack((m-1),ack(m,n-1));
        }
    }
    int main(){
        freopen("ackerman.in","r",stdin);
        freopen("ackerman.out","w",stdout);
        int m,n;
        while(scanf("%d%d",&m,&n)){
            printf("%d
    ",ack(m,n));
        }
    }
  • 相关阅读:
    oo第四次总结
    oo第三次总结
    补给站总结
    OO第四次单元总结
    OO第三次单元总结
    OO第二次单元总结
    OO第一次单元总结
    提问回顾与个人总结
    软件工程结对作业博客
    OO第一次单元总结
  • 原文地址:https://www.cnblogs.com/1129-tangqiyuan/p/8488186.html
Copyright © 2011-2022 走看看