function(记忆化搜索)

本文介绍了一种利用记忆化搜索解决复杂递归问题的方法,通过三维数组存储已计算的结果,避免重复计算,显著提高算法效率。适用于处理大规模数据集。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
思路:也是看了后面的题解才理解和学会这个算法,这是一道记忆化搜索的好题,因为题目描述了后面的数会非常大,所以我们不可能每个数字都去进行一次递归,我们可以将已经计算过的数字存储起来,当我们要用到它时,判断它是否已被记录,如果已被记录那么我们就直接返回里面存储的值即可:
上代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll f[25][25][25]; //用一个三维数组来存储,不用把他想得太抽象话,只要把他想象成对应的三位数里面存储的结果即可
bool vis[25][25][25]; //记忆化搜索,如果搜过的数字就将他标记为已搜索,然后直接返回里面存储的值即可
ll a,b,c; //三个数字,因为会比较大记得开Longlong
ll mw(ll a,ll b,ll c){ //递归程序
	if(a<=0||b<=0||c<=0)return 1; //题目的前两个条件符合的话直接输出即可
	if(a>20||b>20||c>20)return mw(20,20,20); 
	if(vis[a][b][c])return f[a][b][c]; //如果这三位数字被调用过,直接返回即可
	if(a<b&&b<c){ 
		f[a][b][c]=mw(a,b,c-1)+mw(a,b-1,c-1)-mw(a,b-1,c);
	}else{ 
		f[a][b][c]=mw(a-1,b,c)+mw(a-1,b-1,c)+mw(a-1,b,c-1)-mw(a-1,b-1,c-1);
	}
	vis[a][b][c]=true; //当前三位数字搜索完了就将他们标记为已搜索
	return f[a][b][c]; //返回结果即可
}
int main(){
	memset(vis,false,sizeof(vis)); //初始化为false
	scanf("%lld %lld %lld",&a,&b,&c); //输出三个数
	while(1){
		if(a==-1&&b==-1&&c==-1){ //如果满足推出条件就把他推出,否则继续循环输入
			break;
		}else{
			printf("w(%lld, %lld, %lld) = %lld\n",a,b,c,mw(a,b,c)); //输出的时候要注意空格,我被这个格式问题wa了好几发
		    scanf("%lld %lld %lld",&a,&b,&c);
		}
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

这咋又bug了嘛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值