F.cpp 783 B

123456789101112131415161718192021222324252627282930313233343536
  1. /*记忆化搜索*/
  2. #include<bits/stdc++.h>
  3. using namespace std;
  4. ll v[25][25][25]={0};
  5. ll w(ll a,ll b,ll c){
  6. if(a<=0||b<=0||c<=0){return 1;}
  7. else if(v[a][b][c]!=0) return v[a][b][c];
  8. else if(a>20||b>20||c>20) v[a][b][c]=w(20,20,20);
  9. else if(a<b&&b<c){
  10. v[a][b][c]=w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c);
  11. }
  12. else{
  13. 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);
  14. }
  15. return v[a][b][c];
  16. }
  17. int main()
  18. {
  19. ll a,b,c;
  20. while(cin>>a>>b>>c){
  21. memset(v,0,sizeof(v));
  22. if(a==-1&&b==-1&&c==-1){
  23. return 0;
  24. }
  25. printf("w(%lld, %lld, %lld) = ",a,b,c);
  26. if(a>20) a=21;
  27. if(b>20) b=21;
  28. if(c>20) c=21;
  29. printf("%lld\n",w(a,b,c));
  30. }
  31. }