|
记忆化搜索!
#include<iostream>#include<cstdio>#include<cstring>using namespace std;int dp[21][21][21];int w(int a,int b,int c){if(a<=0||b<=0||c<=0) {dp[a][b][c]=1;return 1;} if(dp[a][b][c]!=0)return dp[a][b][c]; if(a<b&&b<c){dp[a][b][c]=w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c);return dp[a][b][c];}else {dp[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 dp[a][b][c];}}int main(){int a,b,c,x,y,z;while(cin>>a>>b>>c){if(a==-1&&c==-1&&b==-1) break;if(a<=0||b<=0||c<=0 )printf("w(%d, %d, %d) = %d\n",a,b,c,1);else {x=a;y=b;z=c;if(a>20||b>20||c>20){x=20;y=20;z=20;}memset(dp,0,sizeof(0));printf("w(%d, %d, %d) = %d\n",a,b,c,w(x,y,z));}}return 0;} |
|