再帰方法(c++)

11873 ワード

例えばw(30,−1,0)w(30,−1,0)w(30,−1,0)が条件1を満たし,条件2を満たす場合,最上位の条件で計算するので,1入力試験サンプルは複数の試験データからなる.各試験データの1行目に3つの整数a,b,c(-20<=a,b,c<=20)を入力a,b,cがいずれも-1であればプログラム出力を終了して再帰した結果サンプル入力Copy 1 1 1 1 1 1 1 1 2 2 2-1-1サンプル出力Copy w(1,1)=2 w(2,2,2)=4
コード(メモリ検索)
#include
using namespace std;
long long dp[50][50][50];
long long dfs(long long n,long long m,long long h){
    if(n>0&&m>0&&h>0&&dp[n][m][h]!=0){
    	return dp[n][m][h];
	}
	if(n<=0||m<=0||h<=0){
    	return 1;
	}
    if(n>20||m>20||h>20) {
       dp[n][m][h]=dfs(20,20,20);
	   return dp[n][m][h];	
	}
    if(n<m&&m<h){
    	dp[n][m][h]=dfs(n,m,h-1)+dfs(n,m-1,h-1)-dfs(n,m-1,h);
    	return dp[n][m][h];
	}
    dp[n][m][h]=dfs(n-1,m,h)+dfs(n-1,m-1,h)+dfs(n-1,m,h-1)-dfs(n-1,m-1,h-1);
	return dp[n][m][h];
}
int main(){
    long long a,b,c;
    while(cin>>a>>b>>c){
    	if(a==-1&&b==-1&&c==-1) break;
        memset(dp,0,sizeof(dp));
        cout<<"w("<<a<<", "<<b<<", "<<c<<") = "<<dfs(a,b,c)<<endl;
    }
    return 0;
}