递归方法(c++)

题目描述
比如 w(30,-1,0)w(30,−1,0)既满足条件1又满足条件2
这种时候我们就按最上面的条件来算
所以答案为1
输入
测试样例由多组测试数据组成。每组测试数据第一行输入三个整数 a , b ,c ( -20 <= a,b,c <= 20 )
如果a,b,c均为-1则退出程序
输出
输出递归后的结果
样例输入 Copy
1 1 1
2 2 2
-1 -1 -1
样例输出 Copy
w(1, 1, 1) = 2
w(2, 2, 2) = 4

代码 (记忆化搜索)

#include<bits/stdc++.h>
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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值