洛谷P1464 Function
洛谷P1464 Function
题目描述
对于一个递归函数w(a,b,c)w(a,b,c)
- 如果a \le 0a≤0 or b \le 0b≤0 or c \le 0c≤0就返回值11.
- 如果a>20a>20 or b>20b>20 or c>20c>20就返回w(20,20,20)w(20,20,20)
- 如果a<ba<b并且b<cb<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)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均为15时,调用的次数将非常的多。你要想个办法才行.
absi2011 : 比如 w(30,-1,0)w(30,−1,0)既满足条件1又满足条件2 这种时候我们就按最上面的条件来算 所以答案为1
输入格式
会有若干行。
并以-1,-1,-1−1,−1,−1结束。
保证输入的数在[-9223372036854775808,9223372036854775807][−9223372036854775808,9223372036854775807]之间,并且是整数。
输出格式
输出若干行,每一行格式:
1 | w(a, b, c) = ans |
注意空格。
输入输出样例
输入 #1
1 | 1 1 1 |
输出 #1
1 | w(1, 1, 1) = 2 |
说明/提示
记忆化搜索
题目理解起来还是没有什么问题的,只要跟着题目的描述来写一个递归就可以了,但是提交上去就会惊喜的发现所有的测试点全部都TLE,这明摆着是要对递归进行优化。
优化的方法也很简单,使用一个数组来记录某一组数据的最终值,再次遇到这个值的时候就不需要重复运算了,直接去查表即可,可以大大减少运算量。这就是记忆化搜索。
1 |
|
使用记忆化搜索时可以定义一个宏#define JUDGE(a, b, c) (W[a][b][c] ? W[a][b][c] : W[a][b][c] = recursion(a, b, c))
这样就不用每个递归都写一大段的判断了。今天也是第一次感受到宏函数的强大,用宏来定义一个函数在应用中还是很方便的。
洛谷P1464 Function