49周周赛I题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
int re[21][21][21];
long long w(long long,long long,long long);
int main()
{
	long long a,b,c;
	while(1)
	{
	    cin>>a>>b>>c;
	    if(a==-1&&b==-1&&c==-1)     return 0;
	    else   
	    printf("w(%lld, %lld, %lld) = %d\n",a,b,c,w(a,b,c));
	}
	return 0;
}

long long w(long long a,long long b,long long c)
{
    if(a<=0||b<=0||c<=0)        return 1;
    else if(a>20||b>20||c>20)   return w(20,20,20);
    else if(re[a][b][c]!=0)     return re[a][b][c];
    else if(a<b&&b<c)
    {re[a][b][c]=w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c);}
    else  
    {re[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);}
    return re[a][b][c];
    
}

       这题本质上不难,但是一个记忆化搜索的典型例题,由于在某些情况下,会导致递归次数非常多,会爆栈。因此采用记忆化搜索,记忆化搜索就是用数组保存每一次递归时得到的数据,这样下次递归需要这些数据时就不需要重复计算了。这题使用了三维数组,使得每一个(a,b,c)分别对应一个值。
       同时昨天看了一个东西让我注意了一个事情,就是以后定义数组时尽量定义在main()函数之外,因为在main()函数之内定义的数组是在栈区开辟的空间,而栈区空间不大,如果数组过大会对程序有影响,但是在main()函数之外定义属于数据区,空间非常大,而且还会自动赋值为0。同时,还专门了解了一下堆区的概念,堆区是程序员在函数中使用malloc函数自己开辟的一组空间,关于这些概念,我的收藏里有学详细的讲解,大家可以去看看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值