ACM Ackermann function(阿克曼函数)
2015-06-09 21:27
399 查看
这个问题真没想到,没留意M最大只有3,也完全没有想到用公式啥的,当时没往这方面想,直接按递归公式写的算法,结果狠狠的巴掌:超时了。。。。
问题描述
众所周知,阿克曼函数中扮演一个重要的角色在理论计算机科学领域。然而,在另一方面,戏剧性的快速增长速度引起的功能很难calcuate阿克曼的价值功能。
阿克曼函数可以递归地定义如下:
现在艾迪给你两个数字:m和n,你的任务是计算的价值(m,n)。这是如此简单的问题,如果你解决这个问题,你将收到一个奖(艾迪将邀请你,6餐厅吃晚饭)。
输入
的每一行输入两个整数,即m,n,0 < m < = 3。
注意,当m < 3,n可以是任意整数不到1000000,而m = 3,n的值限制在24。
输入终止结束的文件。
输出
为每个值m,n,打印出的价值(m,n)。
样例输入
样例输出
下面是超时的代码:
问题描述
众所周知,阿克曼函数中扮演一个重要的角色在理论计算机科学领域。然而,在另一方面,戏剧性的快速增长速度引起的功能很难calcuate阿克曼的价值功能。
阿克曼函数可以递归地定义如下:
现在艾迪给你两个数字:m和n,你的任务是计算的价值(m,n)。这是如此简单的问题,如果你解决这个问题,你将收到一个奖(艾迪将邀请你,6餐厅吃晚饭)。
输入
的每一行输入两个整数,即m,n,0 < m < = 3。
注意,当m < 3,n可以是任意整数不到1000000,而m = 3,n的值限制在24。
输入终止结束的文件。
输出
为每个值m,n,打印出的价值(m,n)。
样例输入
1 3 2 4
样例输出
5 11
下面是超时的代码:
int fun(int m, int n) { if(m==0) return n+1; if(m>0 && n == 0) { fun(m-1,1); } if (m>0 && n>0) { fun(m-1,fun(m,n-1)); if (m==3) { if(n>24) n=24; } } }
M最大是3 所以可以直接把m=1,2,3 的公式推出来,推导m=1时要结合m=0时推 推导m=2时用m=1时 同理可得到 m=0 n+1; m=1 n+2; m=2 2*n+3 m=3 dp[3][i]=2*dp[3][i-1]+3;
#include<stdio.h> long int A(long int,long int); main() { long int n,m; while(scanf("%ld%ld",&m,&n)!=EOF) printf("%ld\n",A(m,n)); } long int A(long int m,long int n) { if(n==0) return A(m-1,1); else if(m==0)return n+2; else if(m==1) return n+2; else if(m==2) return 2*n+3; else if(m==3)return A(m,n-1)*2+3;<pre name="code" class="cpp"> //else if(m==3) return (1<<n+3)-3;}
相关文章推荐
- Mario tcp
- Android Configuration change引发的问题及解决方法(转)
- 传奇绘图更换笔记:ZenGL 一些需要注意的事情
- Linux下 svn 迁移到 git 保留log记录
- winform视频教程-任务定时循环执行小工具
- 百度图片api
- UVA 11264 Fire!
- 如何评价 IBM 收购 Blue Box 集团
- IGBT散热分析
- 剑指offer—第三章高质量代码(o(1)时间删除链表节点)
- Android学习系列--App调试内存泄露之Context篇
- CleanCode笔记---有意义的命名
- Linux通配符摘要
- IDL视频教程
- DZ3.2手机端访问bug彻底解决方法:您访问的页面无手机页面,是否进一步访问电脑版
- cocos2d-x 3.6版连连看
- codeevs 1069关押罪犯,关系并查集
- 初级算法整理,选择排序法
- 黑客帝国屏保源码
- RT-thread-2.0.1移植(基于STM32F4xx)