记忆划搜索
陈子骏
2018-04-01 16:48:40
```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));
}
}
```