PKU ACM 1579

来源:互联网 发布:梦幻西游 mac问题 编辑:程序博客网 时间:2024/05/09 02:48

 



Description

We all love recursion! Don't we? 

Consider a three-parameter recursive function w(a, b, c): 

if a <= 0 or b <= 0 or c <= 0, then w(a, b, c) returns: 


if a > 20 or b > 20 or c > 20, then w(a, b, c) returns: 
w(20, 20, 20) 

if a < b and b < c, then w(a, b, c) returns: 
w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c) 

otherwise it returns: 
w(a-1, b, c) + w(a-1, b-1, c) + w(a-1, b, c-1) - w(a-1, b-1, c-1) 

This is an easy function to implement. The problem is, if implemented directly, for moderate values of a, b and c (for example, a = 15, b = 15, c = 15), the program takes hours to run because of the massive recursion.


所谓动态规划,是因为递归中产生的重叠子问题,导致低效率,为了提高效率,有两种方法:记忆化搜索和自底向上递推。
这里显然可以用一个三维数组自底向上的递推,另外轮换对称的性质(w(a,b,c-1)==w(a,b-1,c))也可以简化计算。注意判断条件的先后顺序,否则wa