记忆划搜索

陈子骏

2018-04-01 16:48:40

Personal

```cpp #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<cmath> #include<bits/stdc++.h> using namespace std; typedef long long ll; ll f[21][21][21]; 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 1048576; else if(f[a][b][c]) return f[a][b][c]; else { if(a<b&&b<c) f[a][b][c]=dfs(a,b,c-1)+dfs(a,b-1,c-1)-dfs(a,b-1,c); else 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); return f[a][b][c]; } } int main() { long long a,b,c; while(1) { scanf("%lld%lld%lld",&a,&b,&c); if(a==-1&&b==-1&&c==-1) break; printf("w(%lld, %lld, %lld) = ",a,b,c); if(a>20) a=21; if(b>20) b=21; if(c>20) c=21; printf("%lld\n",dfs(a,b,c)); } } ```