传送门:POJ - 1579:Function Run Fun
思路:递归的规则已经告诉你了,注意输出格式,照着去实现就好了;
有个需要注意的地方就是,要使用记忆化搜索,当遇到已经计算了的就直接返回,避免因重复计算而超时。
AC代码:
#include<iostream>
#include<cstdio>
using namespace std;
typedef long long LL;
LL ans[21][21][21]={0};
LL f(int a, int b, int c)
{
if(a<=0 || b<=0 || c<=0) return 1;
if(a>20 || b>20 || c>20) return f(20,20,20);
if(ans[a][b][c]) return ans[a][b][c];//关键语句,避免重复计算
if(a<b && b<c) ans[a][b][c]=f(a,b,c-1)+f(a,b-1,c-1)-f(a,b-1,c);
else ans[a][b][c]=f(a-1,b,c)+f(a-1,b-1,c)+f(a-1,b,c-1)-f(a-1,b-1,c-1);
return ans[a][b][c];
}
int main()
{
int a,b,c;
while(~scanf("%d%d%d",&a,&b,&c){
if(a==-1&&b==-1&&c==-1) break;
printf("w(%d, %d, %d) = %lld\n",a,b,c,f(a,b,c));
}
return 0;
}