题目描述
给定一个函数 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)。
看起来简单的一个函数?你能做对吗?
输入
输入包含多组测试数据,对于每组测试数据:
输入只有一行为 3 个整数a, b, c(a, b, c < 30)。
输出
对于每组测试数据,输出函数的计算结果。
示例输入
1 1 1 2 2 2
示例输出
2 4
用三维数组保存计算值,避免重复计算
#include<stdio.h> int main() { int i,j,k; int s[21][21][21]; for(i=0,j=0; j<21; j++)//下面是初始化过程。 for(k=0; k<21; k++) s[i][j][k]=1; for(i=0,j=0; i<21; i++) for(k=0; k<21; k++) s[i][j][k]=1; for(k=0,j=0; j<21; j++) for(i=0; i<21; i++) s[i][j][k]=1; for(k=1; k<21; k++)//循环给数组赋值 for(j=1; j<21; j++) for(i=1; i<21; i++) if(i<j&&j<k) s[i][j][k]=s[i][j][k-1]+s[i][j-1][k-1]-s[i][j-1][k]; else s[i][j][k]=s[i-1][j][k]+s[i-1][j-1][k]+s[i-1][j][k-1]-s[i-1][j-1][k-1]; while(scanf("%d%d%d",&i,&j,&k)!=EOF) { if(i<1||j<1||k<1)//判断分类输出 printf("1\n"); else if(i>20||j>20||k>20) printf("%d\n",s[20][20][20]); else printf("%d\n",s[i][j][k]); } return 0; }