codevs1910 递归函数

时间:2023-03-08 23:27:01
codevs1910 递归函数
难度等级:黄金
codevs1910 递归函数
题目描述 Description

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

如果a <= 0 or b <= 0 or c <= 0就返回值1。

如果a > 20 or b > 20 or c > 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 − 1, b, c) + w(a − 1, b − 1, c) + w(a − 1, b, c − 1) − w(a −1, b - 1, c - 1)

这是个简单的递归函数,但实现起来可能会有些问题。

输入描述 Input Description

会有若干行.每行三个数,表示a, b, c。并以−1, −1, −1结束

输出描述 Output Description

输出若干行,注意各种中的空格。

样例输入 Sample Input

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

样例输出 Sample Output

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

数据范围及提示 Data Size & Hint

a, b, c < 30, Task < 11

这是一道裸的递归转记忆化搜索的问题。

设一个三维数组f[a][b][c],表示w(a,b,c)相应的值。在每次递归之前判断f[a][b][c]是否已经算过一次,若算过直接加上f[a][b][c]的值;若没有算过,则加上递归w(a,b,c)的值,同时把递归结果赋值给f[a][b][c].

本题特别注意输出格式,数字与数字之间有空格,等号与数字之间也有空格。以样例为例:w(1,空格1,空格1)空格=空格2

#include<iostream>
#include<cstdio>
using namespace std;
int aa,bb,cc;
int f[][][];
int w(int a,int b,int c)
{
if(a<=||b<=||c<=) return ;
else if(a>||b>||c>)
{
if(f[][][]) return f[][][];
else return w(,,);
}
else if(a<b&&b<c)
{
int s=;
if(!f[a][b][c-]) f[a][b][c-]=w(a,b,c-);
s+=f[a][b][c-];
if(!f[a][b-][c-]) f[a][b-][c-]=w(a,b-,c-);
s+=f[a][b-][c-];
if(!f[a][b-][c]) f[a][b-][c]=w(a,b-,c);
s-=f[a][b-][c];
return s;
}
else
{
int s=;
if(!f[a-][b][c]) f[a-][b][c]=w(a-,b,c);
s+=f[a-][b][c];
if(!f[a-][b-][c]) f[a-][b-][c]=w(a-,b-,c);
s+=f[a-][b-][c];
if(!f[a-][b][c-]) f[a-][b][c-]=w(a-,b,c-);
s+=f[a-][b][c-];
if(!f[a-][b-][c-]) f[a-][b-][c-]=w(a-,b-,c-);
s-=f[a-][b-][c-];
return s;
}
}
int main()
{
while(cin>>aa>>bb>>cc)
{
if(aa==-&&bb==-&&cc==-) return ;
printf("w(%d, %d, %d) = %d\n",aa,bb,cc,w(aa,bb,cc));
}
}