• Function 洛谷P1464


    题目描述

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

    • 如果 a ≤ 0 a \le 0 a0 b ≤ 0 b \le 0 b0 c ≤ 0 c \le 0 c0 就返回值$ 1$。
    • 如果 a > 20 a>20 a>20 b > 20 b>20 b>20 c > 20 c>20 c>20 就返回 w ( 20 , 20 , 20 ) w(20,20,20) w(20,20,20)
    • 如果 a < b aa<b 并且 b < c bb<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) w(a1,b,c)+w(a1,b1,c)+w(a1,b,c1)w(a1,b1,c1)

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

    注意:例如 w ( 30 , − 1 , 0 ) w(30,-1,0) w(30,1,0) 又满足条件 1 1 1 又满足条件 2 2 2,请按照最上面的条件来算,答案为 1 1 1

    输入格式

    会有若干行。

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

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

    输出格式

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

    w(a, b, c) = ans

    注意空格。

    样例 #1

    样例输入 #1

    1 1 1
    2 2 2
    -1 -1 -1
    
    • 1
    • 2
    • 3

    样例输出 #1

    w(1, 1, 1) = 2
    w(2, 2, 2) = 4
    
    • 1
    • 2

    算法解析

    这道题直接递归会超时,要用记忆化搜索。
    ans数组记录之前计算的答案,b数组标记。
    一定要先判断边界,再调用(数组下标不能为负)

    代码

    #include
    using namespace std;
    int ans[25][25][25];
    bool bo[25][25][25];
    
    int w(int a,int b,int c)
    {
    	if(a<=0||b<=0||c<=0)//递归边界
    		return 1;
    	if(a>20||b>20||c>20)//递归边界
    		return w(20,20,20);
    	if(bo[a][b][c])//如果计算过,直接调用
    		return ans[a][b][c];
    	if(a<b&&b<c)
    	{
    		ans[a][b][c]=w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c);
    		bo[a][b][c]=1;//一定不要忘记标记
    		return ans[a][b][c];
    	}
    	ans[a][b][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);
    	bo[a][b][c]=1;
    	return ans[a][b][c];
    }
    
    int main()
    {
    	int a,b,c;
    	while(scanf("%d%d%d",&a,&b,&c))
    	{
    		if(a==-1&&b==-1&&c==-1)
    			return 0;
    		printf("w(%d, %d, %d) = %d\n",a,b,c,w(a,b,c));//要写换行符,不然会WA
    	}
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
  • 相关阅读:
    树状数组&线段树 的奇妙用法
    1.6-02:陶陶摘苹果
    如何从算法方面提升论文档次
    window 如何使用命令行运行.exe文件?
    Python logging 模块详解
    力扣打卡----打家劫舍
    (2023|ICML,LLM,标记掩蔽,并行解码)Muse:使用掩蔽生成 Transformer 的文本到图像生成
    Flowable-6.7.2:数据库详情
    [深度学习] 搭建行人重识别系统心得
    leetcode做题笔记174. 地下城游戏
  • 原文地址:https://blog.csdn.net/whd_wanghaoda/article/details/126085235