【题解】桐桐的递归函数

题目描述

桐桐经常找一些很有趣的数学书来阅读以增长自己的数学知识。

一天,他偶然发现一个递归函数w(a,b,c)有以下性质:

如果a≤0或b≤0或c≤0,就返回值1;

如果a>20或b>20或c>20,就返回w(20,20,20);

其它别的情况就返回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,c三个整数,-50≤a,b,c≤50。

输出格式:

a,b,c三个整数所对应的w(a,b,c)函数的值。要求以w(a, b, c)=函数的值来输出。

输入输出样例

输入样例一:
1 1 1
输出样例一:
2
输入样例二:
50 50 50
输出样例二:
1048576
做法:递归、记忆化递归
用一个三维数组储存函数w(a,b,c)的值,把它分解为若个子问题,遇到特别大的值时就把它分解为若干子问题的值,就可以很快求出答案
具体程序如下:
#include<iostream>
using namespace std;
int num[55][55][55];
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 1048576;
    else
    {
        if(num[a][b][c]!=0) return num[a][b][c];
        else return num[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);
    }
} 
int main()
{
    int x,y,z;
    cin>>x>>y>>z;
    cout<<w(x,y,z);
}

原文地址:https://www.cnblogs.com/2021-yanghaoran/p/10716695.html