题目:
对于一个递归函数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.