问题
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 }