123456789101112131415161718192021222324252627282930313233343536 |
- /*记忆化搜索*/
- #include<bits/stdc++.h>
- using namespace std;
- ll v[25][25][25]={0};
- ll w(ll a,ll b,ll c){
- if(a<=0||b<=0||c<=0){return 1;}
- else if(v[a][b][c]!=0) return v[a][b][c];
- else if(a>20||b>20||c>20) v[a][b][c]=w(20,20,20);
- else if(a<b&&b<c){
- v[a][b][c]=w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c);
- }
- else{
- v[a][b][c]=w(a-1,b,c)+w(a-1,b-1,c)+w(a-1,b,c-1)-w(a-1,b-1,c-1);
- }
- return v[a][b][c];
- }
- int main()
- {
- ll a,b,c;
- while(cin>>a>>b>>c){
- memset(v,0,sizeof(v));
- if(a==-1&&b==-1&&c==-1){
- return 0;
- }
- 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",w(a,b,c));
- }
- }
|