模拟递归问题。直接递归肯定不行,最容易想到的方法就是用数组模拟。中途遇到了一个问题,就是 C++ iostream 库的效率问题。用 cin >> a >> b >> c 时,TLE;换成 scanf("%d%d%d", &a, &b, &c) 时,AC,时间 80 ms。status中最前面的都是 60ms,看来优化空间不大。关于 C 库和 C++ 库的输入输出,还有待研究。

/**
 * @file   zoj1168.c
 * @author <lox@freelox>
 * @date   Wed May 19 18:59:59 2010
 *
 * @brief  zoj1168, 模拟问题。直接查表解决。
 * 但是需要注意的是,此题目用 scanf 系列,AC,时间 80ms,用 C++ 的cin流,则 TLE,
 * 莫非 cin 和scanf真有那么大的时间消耗差别?
 */


#include <stdio.h>

int main(int argc, char *argv[]) {
  int w[21][21][21];

  int a, b, c;

  for (a = 0; a <= 20; a++) {
    for (b = 0; b <= 20; b++) {
      for (c = 0; c <= 20; c++) {
        if (a == 0 || b == 0 || c == 0) {
          w[a][b][c] = 1;
        }
        else if (a < b && b < c) {
          w[a][b][c] = w[a][b][c-1] + w[a][b-1][c-1] - w[a][b-1][c];
        }
        else
          w[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];
      }
    }
  }

  while (scanf("%d%d%d", &a, &b, &c)) {
    if (a == -1 && b == -1 && c == -1) {
      return 0;
    }
    if (a <= 0 || b <= 0 || c <= 0) {
      printf("w(%d, %d, %d) = %d\n",a,b,c,w[0][0][0]);
    }
    else if (a > 20 || b > 20 || c > 20) {
      printf("w(%d, %d, %d) = %d\n",a,b,c,w[20][20][20]);
    }
    else
      printf("w(%d, %d, %d) = %d\n",a,b,c,w[a][b][c]);
  }

  return 0;
}