首页 > 其他分享 >关于记忆递归

关于记忆递归

时间:2024-02-17 09:03:12浏览次数:28  
标签:zl ch 20 递归 int 记忆 关于 return

我们都知道 递归是不断运行函数以得出结果的运算方式
它的优点在于 简单的几行公式就完全阐释了变换规律
当然 缺点也很明显:
如果要重复进行大数据的运算 会让计算时间极大幅度变长
因此 对递归的优化就尤为重要
首先 题目在这里
原超时代码如下

点击查看代码
#include <bits/stdc++.h>
#define fo(x,y,z) for(int (x)=(y);(x)<=(z);(x)++)
#define fu(x,y,z) for(int (x)=(y);(x)>=(z);(x)--)
#define foo(x,y,z) for(int (x)=(y);(x)<(z);(x)++)
using namespace std;
inline int qr()
{
	char ch=getchar();int x=0,f=1;
	for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
	for(;ch>='0'&&ch<='9';ch=getchar())x=(x<<3)+(x<<1)+(ch^48);
	return x*f;
}
#define qr qr()
typedef long long ll;
const int Ratio=0;
const int N=2005;
const int maxx=0x7f7f7f7f;
int a,b,c,ans;
void read()
{

}
int DrRatio(int a,int b,int c)
{
	if(a<=0||b<=0||c<=0)
		return 1;
	else if(a>20||b>20||c>20)
		return DrRatio(20,20,20);
	else if(a<b&&b<c)
		return DrRatio(a,b,c-1)+DrRatio(a,b-1,c-1)-DrRatio(a,b-1,c);
	else
		return DrRatio(a-1,b,c)+DrRatio(a-1,b-1,c)+DrRatio(a-1,b,c-1)-DrRatio(a-1,b-1,c-1);
}
void op()
{
	printf("w(%d, %d, %d) = %d\n",a,b,c,ans);
}
int main()
{
	read();
	while(scanf("%d%d%d",&a,&b,&c))
	{
		if(a==-1&&b==-1&&c==-1)
			break;
		ans=DrRatio(a,b,c);
		op();
	}
	return Ratio;
}

原代码的计算方式没有问题 超时的原因 题目中也给出了 当求w(15,15,15)时就会进行几小时的冗长计算

优化后更改如下:

int zl[N][N][N];
int DrRatio(int a,int b,int c)
{
	if(a<=0||b<=0||c<=0)
		return 1;
	else if(a>20||b>20||c>20)
		return DrRatio(20,20,20);
	else if(zl[a][b][c])
		return zl[a][b][c];
	else if(a<b&&b<c)
		return zl[a][b][c]=DrRatio(a,b,c-1)+DrRatio(a,b-1,c-1)-DrRatio(a,b-1,c);
	else
		return zl[a][b][c]=DrRatio(a-1,b,c)+DrRatio(a-1,b-1,c)+DrRatio(a-1,b,c-1)-DrRatio(a-1,b-1,c-1);
}

可以看到 添加了一个三维数组 用来存储已经处理过的数据
由题目可以明显得知 在进行数据大一点的运算时 会重复多次计算
因此 增加一个记录处理好的值的数组 会大大减少运算量 使得每组数据只被计算一次
这种类似的构造类函数还有阿克曼函数

标签:zl,ch,20,递归,int,记忆,关于,return
From: https://www.cnblogs.com/DrRatio-DanhengYinyue1007/p/18017700

相关文章

  • 关于一种维护凸包的根号数据结构
    本文介绍了笔者由一道题的根号做法受到启发,独自摸索出来的一个数据结构。由于笔者能力和精力有限,无法查找已有的资料,如果有哪位巨已经提出来了记得踩我一脚。介绍这个数据结构维护凸包,支持以下操作:\(O(\sqrt{n})\)在线加入/删除任意一条线段\(O(\sqrt{n}\log\sqrt{n})\)在......
  • 关于thrift python接口和java通信出现问题解决
    真的无语,搞了一个下午。使用thrift出现错误,先说一下遇到第一个错误,如下图:那时候代码是这叼样```if__name__=='__main__':handler=MessageServiceHandler()processor=MessageService.Processor(handler)transport=TSocket.TServerSocket(None,"9090"......
  • 力扣递归 广度优先搜索之102. 二叉树的层序遍历
    classSolution{   List<List<Integer>>result=newArrayList<>();   publicList<List<Integer>>levelOrder(TreeNoderoot){       if(root==null){           returnresult;       }       traverse(root,0);    ......
  • 力扣递归之 543. 二叉树的直径
    classSolution{//二叉树直径其实就是根到左子树最深+根到右子树最深  intdiameter;    publicintdiameterOfBinaryTree(TreeNoderoot){    calculateDepth(root);    returndiameter;  }    privateintcalculateDe......
  • 力扣递归之101. 对称二叉树
    classSolution{  publicbooleanisSymmetric(TreeNoderoot){    if(root==null){      returntrue;    }    returnisMirror(root.left,root.right);  }    publicbooleanisMirror(TreeNodeleft,Tr......
  • 关于我写的漫展详细游记被我不小心从手机上删除这件事
    我辛辛苦苦写的漫展游记被我不小心删了不想再写了简述:人超级超级多,我这个半吊子进去都有一堆认识的角色,少说20个人cos初音因为我什么都没带,所以我集邮之后疯狂送出巧克力放几张照片https://space.bilibili.com/1673935736?spm_id_from=333.999.0.0视频,知道你们有梯子,跳......
  • 关于传统计算机是否面临没落的数据展示
    今天有位学长跟我说,现在传统的计算机不吃香了,把计算机应用到各行各业才是最好的早听闻有类似的说法,因而笔者搜集了数据进行印证图片来源:工业和信息化部工业文化发展中心图片来源:中国服务外包研究中心图片来源:国研网图片来源:中华人民共和国中央人民政府图片来源:中华人民......
  • 递归查询
    @OverridepublicList<CategoryEntity>listWithTree(){//1、查询出所有分类List<CategoryEntity>entities=super.baseMapper.selectList(null);//2、组装成父子的树形结构//2.1)、找到所有一级分类List<CategoryEntity>levelMenus=entities.stream(......
  • 关于多线程的介绍
    一、进程与线程1.进程:进程是操作系统中一种非常重要的软件资源,当我们把一个可执行程序exe运行起来的时候,系统就会随之创建一个进程,如果这个程序结束系统会随之销毁对应的进程。当运行exe文件时,exe文件中的很多内容都加载到内存中,通过分配资源来执行这个程序包含的指令的过程叫......
  • 【学习笔记】关于图论的一切
    存图邻接矩阵边集邻接表最小生成树primkruskal最短路dij堆优化spfafloyd欧拉路欧拉回路scc缩点2-sAT二分图基础概念匈牙利DAG最小链覆盖网络流Dinic最小割最大权闭合子图最小割集费用流Zkw双连通问题割边割点双连通分量圆方树生成树计数......