再帰方法(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;
}