栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

B - 阿克曼函数(记忆化搜索(啊呸))

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

B - 阿克曼函数(记忆化搜索(啊呸))

 在我的不懈努(爆)力(零)下,我把阿克曼函数的记忆化搜索用我的泥头车创出来了(啧),不过这个记忆化应该不是最优解(或者说仿?),31ms跑完小数据,说实话有点慢(确实),如果有大lao写出了正宗的记忆化搜索,,请赐教!评论或私信都行!

阿克曼(Arkmann)函数  A(m,n)A(m,n)  中,m与n的定义域是非负整数且本题中m<=3,n<=16。

函数的定义为:
$$akm(m,n)=left{
begin{align}
&n+1 && (m=0)\
&akm(m-1,1) && (m>0,n=0)\
&akm(m-1,akm(m,n-1)) &&  (m>0,n>0)\
end{align}
right.$$

Input

两个整数 m n

Output

一个整数,akm(m,n)的结果

Sample Input

1 1

Sample Output

3

Sponsor

#define _CRT_SECURE_NO_WARNINGS
#include
#include
using namespace std;
typedef long long ll;
ll m, n;//后面这些地方用int也没事,刚开始做题的时候我拿不准,用的ll
ll p[5][550000];//b的峰值在550000左右(试出来的,我的小笔记本连3,13都跑不动)
ll Ack(ll a, ll b) {//已经限定过非负整数了,注意a,b和m,n并不等价,只是调用了初始值
	if (p[a][b]) return p[a][b];
	if (a == 0) {
		p[a][b] = b + 1;//记忆化
		return b + 1;
	}
	else if (a > 0 && b == 0) {
		ll k = Ack(a - 1, 1);
		p[a][b] = k;
		return k;
	}
	else {
		ll k = Ack(a - 1, Ack(a, b - 1));
		p[a][b] = k;
		return k;
	}
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
		cin >> m >> n;
		cout << Ack(m, n) << endl;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/717602.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号