给定一个函数 f(a, b, c):
如果 a ≤ 0 或 b ≤ 0 或 c ≤ 0 返回值为 1;
如果 a > 20 或 b > 20 或 c > 20 返回值为 f(20, 20, 20);
如果 a < b 并且 b < c 返回 f(a, b, c−1) + f(a, b−1, c−1) − f(a, b−1, 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)
本题就是按题目要求公式写一个简单的递归函数,而且要用一个三维数组做记忆化处理,其实这题我是在同学的提醒下写出的三维数组,并用memset做数组填充处理,因数组不会有负数,所以预先进去-1。
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
int F[21][21][21];
int 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(F[a][b][c]!=-1)//如果不是负数则输出
return F[a][b][c];
if(a<b&&b<c)
{return F[a][b][c]=f(a,b,c-1)+f(a,b-1,c-1)-f(a,b-1,c);}
return F[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);
}
int main()
{
int m,n,o,x;
memset(F,-1,sizeof(F));
while(cin>>m>>n>>o)
{
x=f(m,n,o);
cout<<x<<endl;
}
}