题目:
对于一个递归函数w(a,b,c)
如果a<=0 or b<=0 or c<=0就返回值1.
如果a>20 or b>20 or c>20就返回w(20,20,20)
如果a<b并且b<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,c均为15时,调用的次数将非常的多。你要想个办法才行.
直接加一个记忆化递归迭代。
如此水题,我竟然WA了一次!
如此水题,我竟然WA了一次!
究其原因,我的优先级搞错了。
如果有一个>20,有一个<0,那么优先<0.
其他,就是注意空格的问题了。
const small=-2139062144; var f:array[0..20,0..20,0..20] of longint; a,b,c,aa,bb,cc:longint; function go(a,b,c:longint):longint; begin if (a<=0) or (b<=0) or (c<=0) thenexit(1); if (a>20) or (b>20) or (c>20) thenexit(go(20,20,20)); if f[a,b,c]>small then exit(f[a,b,c]); if (a<b) and (b<c) then begin f[a,b,c]:=go(a,b,c-1)+go(a,b-1,c-1)-go(a,b-1,c); exit(f[a,b,c]); end; f[a,b,c]:=go(a-1,b,c)+go(a-1,b-1,c)+go(a-1,b,c-1)-go(a-1,b-1,c-1); exit(f[a,b,c]); end; begin fillchar(f,sizeof(f),128); f[0,0,0]:=1; readln(a,b,c); while (a<>-1) or (b<>-1) or (c<>-1)do begin writeln('w(',a,', ',b,', ',c,') =',go(a,b,c)); readln(a,b,c); end; end.