题目—递归函数 (shiyancang.cn)
记忆化dfs,注意dp的限制范围
#include<bits/stdc++.h> using namespace std; const int N=52; typedef long long ll; ll dp[N][N][N]; ll a,b,c; ll dfs(ll a,ll b,ll c) { if(a<=0||b<=0||c<=0) return 1; else if(a>20||b>20||c>20) return dfs(20,20,20); else if(dp[a][b][c]) return dp[a][b][c]; else if(a<b&&b<c) dp[a][b][c]=dfs(a,b,c-1)+dfs(a,b-1,c-1)-dfs(a,b-1,c); else dp[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); return dp[a][b][c]; } int main() { while(~scanf("%lld%lld%lld",&a,&b,&c),a!=-1&&b!=-1&&c!=-1) { cout<<dfs(a,b,c)<<endl; } return 0; }