对于一个递归函数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]之间,并且是整数。
输出格式
输出若干行,每一行格式:
w(a, b, c) = ans
注意空格。
输入输出样例
输入 #1复制
1 1 1 2 2 2 -1 -1 -1
输出 #1复制
w(1, 1, 1) = 2 w(2, 2, 2) = 4
说明/提示
记忆化搜索
dic = {}
def w(a,b,c):
if a<=0 or b <= 0 or c<=0:return 1
elif a > 20 or b > 20 or c > 20:return w(20,20,20)
elif a < b and b<c:
if (a,b,c-1) in dic:x = dic[(a,b,c-1)]
else:
x = w(a,b,c-1)
dic[(a,b,c-1)] = x
if (a,b-1,c-1) in dic:y = dic[(a,b-1,c-1)]
else:
y = w(a,b-1,c-1)
dic[(a,b-1,c-1)] = y
if (a,b-1,c) in dic:z = dic[(a,b-1,c)]
else:
z = w(a,b-1,c)
dic[(a,b-1,c)] = z
return x+y-z
else:
if (a-1,b,c) in dic:x = dic[(a-1,b,c)]
else:
x = w(a-1,b,c)
dic[(a-1,b,c)] = x
if (a-1,b-1,c) in dic:y = dic[(a-1,b-1,c)]
else:
y = w(a-1,b-1,c)
dic[(a-1,b-1,c)] = y
if (a-1,b,c-1) in dic:z = dic[(a-1,b,c-1)]
else:
z = w(a-1,b,c-1)
dic[(a-1,b,c-1)] = z
if (a-1,b-1,c-1) in dic:q = dic[(a-1,b-1,c-1)]
else:
q = w(a-1,b-1,c-1)
dic[(a-1,b-1,c-1)] = q
return x+y+z-q
while 1:
a,b,c = map(int,input().split())
if a+b+c != -3:print('w(%d, %d, %d) = %d'%(a,b,c,w(a,b,c)))
else:break
# w(1, 1, 1) = 2
# w(2, 2, 2) = 4