I can't stand the problem.
TLE many times just because of using cin/cout :(
TLE many times just because of using cin/cout :(
1 /* Accepted 1168 C++ 00:00.21 472K */
2 #include <stdio.h>
3
4 int f[21][21][21];
5 int w(int a, int b, int c)
6 {
7 if(a <= 0 || b <= 0 || c <= 0)
8 return 1;
9
10 if(f[a][b][c])
11 return f[a][b][c];
12
13 if(a < b && b < c)
14 return f[a][b][c] = w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c);
15 return f[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);
16 }
17
18 int main()
19 {
20 int a, b, c;
21 while(scanf("%d %d %d", &a, &b, &c) != EOF)
22 {
23 if(a == -1 && b == -1 && c == -1)
24 break;
25
26 printf("w(%d, %d, %d) = ", a, b, c);
27 if(a <= 0 || b <= 0 || c <= 0)
28 printf("1\n");
29 else
30 {
31 if(a > 20 || b > 20 || c > 20)
32 a = 20, b = 20, c = 20;
33 printf("%d\n", w(a, b, c));
34 }
35 }
36
37 return 0;
38 }
39
2 #include <stdio.h>
3
4 int f[21][21][21];
5 int w(int a, int b, int c)
6 {
7 if(a <= 0 || b <= 0 || c <= 0)
8 return 1;
9
10 if(f[a][b][c])
11 return f[a][b][c];
12
13 if(a < b && b < c)
14 return f[a][b][c] = w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c);
15 return f[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);
16 }
17
18 int main()
19 {
20 int a, b, c;
21 while(scanf("%d %d %d", &a, &b, &c) != EOF)
22 {
23 if(a == -1 && b == -1 && c == -1)
24 break;
25
26 printf("w(%d, %d, %d) = ", a, b, c);
27 if(a <= 0 || b <= 0 || c <= 0)
28 printf("1\n");
29 else
30 {
31 if(a > 20 || b > 20 || c > 20)
32 a = 20, b = 20, c = 20;
33 printf("%d\n", w(a, b, c));
34 }
35 }
36
37 return 0;
38 }
39