洛谷 P1464 Function C语言 递归 记忆化搜索

题目描述

对于一个递归函数w(a,b,c)w(a,b,c)

  • 如果a≤0 or b≤0 or c≤0就返回值11.
  • 如果a>20 or b>20 or c>20就返回w(20,20,20)w(20,20,20)
  • 如果a<b并且b<c 就返回w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c)w(a,b,c−1)+w(a,b−1,c−1)−w(a,b−1,c)
  • 其它的情况就返回w(a-1,b,c)+w(a-1,b-1,c)+w(a-1,b,c-1)-w(a-1,b-1,c-1)w(a−1,b,c)+w(a−1,b−1,c)+w(a−1,b,c−1)−w(a−1,b−1,c−1)

这是个简单的递归函数,但实现起来可能会有些问题。当a,b,ca,b,c均为15时,调用的次数将非常的多。你要想个办法才行.

absi2011 : 比如 w(30,-1,0)w(30,−1,0)既满足条件1又满足条件2
这种时候我们就按最上面的条件来算
所以答案为1

输入格式

会有若干行。

并以−1,−1,−1结束。

保证输入的数在[−9223372036854775808,9223372036854775807]之间,并且是整数。

输出格式

输出若干行,每一行格式:

w(a, b, c) = ans

注意空格。

输入输出样例

输入 #1复制

1 1 1
2 2 2
-1 -1 -1

输出 #1复制

w(1, 1, 1) = 2
w(2, 2, 2) = 4
#include<stdio.h>
long f[99][99][99];
int fun(long a, long b, long c) {
	if ((a <= 0 || b <= 0 || c <= 0))return 1;//根据题意,当同时满足多个条件时,按第一个条件执行,所以第一个条件摆在第一个即可
	if (a > 20 || b > 20 || c > 20) return fun(20, 20, 20);
	if (f[a][b][c] != 0)return f[a][b][c];//说明f[a][b][c]之前已经调用过,有值了,就不用再调用了。
	if (a < b && b < c)f[a][b][c]= fun(a, b, c - 1) + fun(a, b - 1, c - 1) - fun(a, b - 1, c);//每一次记得赋值
	else f[a][b][c]= fun(a - 1, b, c) + fun(a - 1, b - 1, c) + fun(a - 1, b, c - 1) - fun(a - 1, b - 1, c - 1);
	return f[a][b][c];//返回相应值
}
int main(){
	long a, b, c;
	while (scanf("%ld%ld%ld", &a, &b, &c) && (a != -1 || b != -1 || c != -1) ){
		//判断条件是a和b和c不都为-1,所以是||
		printf("w(%ld, %ld, %d) = %d\n", a, b, c, fun(a, b, c));
	}
	return 0;
}

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
记忆化搜索是一种优化递归算法的方法,它通过保存已计算的结果以避免重复计算,提高算法的效率。引用是一个使用记忆化搜索C语言例子,通过保存计算结果在数组f中,避免了重复计算。在这个例子中,函数w用来计算三个参数a、b、c的结果,并使用数组f保存计算结果。当函数w被调用时,首先判断是否已经计算过,如果是则直接返回结果,否则进行计算并保存结果。该例子中的递归调用是通过不断减小参数a、b、c的值来实现的。引用是一个使用记忆化搜索的Java语言例子,它用来计算一个数组nums中能够组成目标值S的方式数量。与引用类似,它使用了一个二维数组memo来保存计算结果,并在递归调用时先判断是否已经计算过。记忆化搜索的优点是可以避免重复计算,提高算法效率。在递归调用时,每一层都会生成一个新的函数实例,它们之间的参数和局部变量是独立的,互不干扰。递归过程中需要明确参数的意义和当前的值,设定递归的边界条件,以及确定递归调用的返回值。记忆化搜索的过程是定义一个数组,用来存储递归所求得的值。在主程序中,对数组进行初始化并设置边界值。在递归函数中,首先判断数组中的值是否已经计算过,如果是则直接返回结果,否则进行计算并保存结果。这样可以避免重复计算,提高算法效率。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [洛谷 P1464 Function](https://blog.csdn.net/HJ921004/article/details/101368809)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [记忆化搜索递归)](https://blog.csdn.net/To_be_to_thought/article/details/99642379)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [递归+记忆化搜索](https://blog.csdn.net/weixin_42696435/article/details/90741289)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Prudento

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

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

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

打赏作者

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

抵扣说明:

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

余额充值