#L0506. 三维递归函数求值

三维递归函数求值

题目描述

给定一个递归函数 w(a,b,c)w(a,b,c),其定义如下:

  • 若 a≤0a \le 0 或 b≤0b \le 0 或 c≤0c \le 0,则返回 11;
  • 若 a>20a \gt 20 或 b>20b \gt 20 或 c>20c \gt 20,则返回 w(20,20,20)w(20,20,20);
  • 若 a<ba \lt b 且 b<cb \lt c,则返回 w(a,b,c−1)+w(a,b−1,c−1)−w(a,b−1,c)w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,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)$。

这个递归函数虽然定义简洁,但直接实现效率很低。例如当 a,b,ca,b,c 均为 1515 时,递归调用次数极多。你需要采用高效的方法来计算。

注意:例如 w(30,−1,0)w(30,-1,0) 同时满足条件 11 和条件 22,应按最先匹配的条件(条件 11)计算,结果为 11。

输入格式

输入包含若干行,每行三个整数 a,b,ca, b, c。

以 −1,−1,−1-1, -1, -1 结束输入。

输出格式

对每组输入输出一行,格式为:

w(a, b, c) = ans

注意 a,b,ca, b, c 和等号两侧各有一个空格。

样例

1 1 1
2 2 2
-1 -1 -1
w(1, 1, 1) = 2

w(2, 2, 2) = 4

</p>

提示

数据规模与约定

  • 保证输入的整数在 [−9223372036854775808,9223372036854775807][-9223372036854775808, 9223372036854775807] 范围内。
  • 不包括终止行 −1,−1,−1-1, -1, -1 的输入行数 TT 满足 1≤T≤1051 \le T \le 10^5。

提示

由于 a,b,ca, b, c 超过 2020 时均被截断为 2020,实际计算范围为 [0,20][0,20],可以使用记忆化搜索(三维数组缓存)将时间复杂度降至 O(1)O(1) 每次查询。

难度 普及-
通过率 —
尝试 0
通过 0
ID
1234
类型
传统题
Time Limit
1000ms
Memory Limit
125MiB
上传者