洛谷P1464 Function(记忆化搜索)

题目描述
对于一个递归函数w(a,b,c)
如果a≤0a \le 0a≤0 or b≤0b \le 0b≤0 or c≤0c \le 0c≤0就返回值111.
如果a>20a>20a>20 or b>20b>20b>20 or c>20c>20c>20就返回w(20,20,20)w(20,20,20)w(20,20,20)
如果a<b并且b<c 就返回w(a,b,c−1)+w(a,b−1,c−1)−w(a,b−1,c)w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,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)这是个简单的递归函数,但实现起来可能会有些问题。当a,b,c均为15时,调用的次数将非常的多。你要想个办法才行. 比如 w(30,−1,0)既满足条件1又满足条件2这种时候我们就按最上面的条件来算所以答案为1
输入输出格式
输入格式:
会有若干行。并以−1,−1,−1结束。
输出格式:
输出若干行,每一行格式:w(a, b, c) = ans注意空格。

#include<iostream>
#include<cstdio>
#include<string.h>
typedef long long ll;
using namespace std;
ll f[25][25][25];
ll w(ll a, ll b, ll c) {
 if (a <= 0 || b <= 0 || c <= 0) {
  return 1;
 }
 else if (f[a][b][c] != 0)return f[a][b][c];
 else if (a > 20 || b > 20 || c > 20) {
  f[a][b][c] = w(20, 20, 20);
  }
  else if (a < b&&b < c)f[a][b][c] = w(a, b, (c - 1)) + w(a, (b - 1), (c - 1)) - w(a, (b - 1), c);
  else f[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 f[a][b][c];
 
}
int main() {
 ll a, b, c;
 while(cin >> a >> b >> c){
  memset(f, 0, sizeof(f));
  
  if (a == -1 && b == -1 && c == -1) {
   break;
  }
  printf("w(%lld, %lld, %lld) = ", a, b, c);
  if (a > 20) a = 21;
  if (b > 20) b = 21;
  if (c > 20) c = 21;
  printf("%lld\n", w(a, b, c));
 }
 return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值