【题解】桐桐的递归函数
题目描述
桐桐经常找一些很有趣的数学书来阅读以增长自己的数学知识。
一天,他偶然发现一个递归函数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); }