题目链接:https://vjudge.net/contest/381841#problem/G
题目描述:
每次输入a,b,c,跟据题目描述的w(a,b,c)来输出答案
解题思路:
记忆化搜索,就注意一下(-1,7,8)这种序号为负的情况无法用数组存,提前处理一下。
代码:

#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
typedef long long ll;
ll f[100][100][100];
ll dfs(int a, int b, int c) {
    if(f[a][b][c] > -INF) return f[a][b][c];
    if(a <= 0 || b <= 0 || c <= 0) return f[a][b][c]=1;
    if(a < b && b < c) return f[a][b][c]=dfs(a,b,c-1)+dfs(a,b-1,c-1)-dfs(a,b-1,c);
    return f[a][b][c]=dfs(a-1,b,c)+dfs(a-1,b-1,c)+dfs(a-1,b,c-1)-dfs(a-1,b-1,c-1);
}
int main()
{
    int a, b, c;
    memset(f, -INF, sizeof(f));
    dfs(20,20,20);
    while(scanf("%d%d%d",&a,&b,&c)!=EOF) {
        ll ans;
        if(a==-1 && b==-1 && c==-1) break;
        if(a <= 0 || b <= 0 || c <= 0) ans = 1;
        else if(a > 20 || b > 20 || c > 20) ans = f[20][20][20];    //你愿意放到dfs函数中也行
        else ans = dfs(a,b,c);
        printf("w(%d, %d, %d) = %lld\n",a,b,c,ans);
    }
}