问题

Submit Status

Description

给定一个函数 f(a, b, c):
如果 a ≤ 0 或 b ≤ 0 或 c ≤ 0 返回值为 1;
如果 a > 20 或 b > 20 或 c > 20 返回值为 f(20, 20, 20);
如果 a < b 并且 b < c 返回 f(a, b, c−1) + f(a, b−1, c−1) − f(a, b−1, c);
其它情况返回 f(a−1, b, c) + f(a−1, b−1, c) + f(a−1, b, c−1) − f(a-1, b-1, c-1)。
看起来简单的一个函数?你能做对吗?

Input

输入包含多组测试数据,对于每组测试数据:
输入只有一行为 3 个整数a, b, c(a, b, c < 30)。

Output

对于每组测试数据,输出函数的计算结果。

Sample Input

1 1 1
2 2 2

Sample Output

2
4
分析:
如果简单的按照题目要求写代码很有可能会超时,所以把重复的步骤只进行一次,就是每算到一个新数,直接赋值,后来就不需要重复计算
代码:
 1 #include<iostream>
 2 using namespace std;
 3 #define ll  long long int
 4 ll a[30][30][30]={0};
 5 ll fu(ll h,int x,int y,int z)
 6 {
 7     a[x][y][z]=h;
 8     return h;
 9 }
10 ll vp(int x,int y,int z)
11 {
12     if(a[x][y][z])
13         return a[x][y][z];
14     else
15     {
16         if(x<=0||y<=0||z<=0)
17             return fu(1,x,y,z);
18         else
19             if(x>20||y>20||z>20)
20                 return fu(vp(20,20,20),x,y,z);
21         else
22             if(x<y&&y<z)
23                 return fu(vp(x,y,z-1)+vp(x,y-1,z-1)-vp(x,y-1,z),x,y,z);
24         else
25             return fu(vp(x-1,y,z)+vp(x-1,y-1,z)+vp(x-1,y,z-1)-vp(x-1,y-1,z-1),x,y,z);
26     }
27 }
28 int main()
29 {
30     int x,y,z;
31     while(cin>>x>>y>>z)
32     {
33         if(x<=0||y<=0||z<=0)
34             cout<<"1"<<endl;
35         else
36             cout<<vp(x,y,z)<<endl;
37     }
38     return 0;
39 }