题目链接: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); } }