当前位置: 首页 > news >正文

算法题(107):function

审题:

本题需要我们根据题目写出递归函数,并返回递归结果

时间复杂度:本题的数据范围虽然很大,但是由于条件2的限制,数据量可以看成是20,于是我们就可以使用递归函数了

思路:
方法一:记忆化搜索

经过分析我们可知:本题会出现完全重复的递归,所以我们需要使用备忘录对已经知道结果的递归结果记录,每次进入递归时要记得查找备忘录

解题:
 

#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
ll a,b,c;
const int N = 25;
ll f[N][N][N];//备忘录

(1)main函数

int main() 
{
    memset(f, -1, sizeof(f));
    while (cin >> a >> b >> c) {
        if (a == -1 && b == -1 && c == -1) break;//结束数据录入
        printf("w(%lld, %lld, %lld) = %lld\n", a, b, c, w(a, b, c));
    }
    return 0;
}

(2)dfs递归函数

ll w(ll a, ll b, ll c)
 {
//条件1特殊处理
    if (a <= 0 || b <= 0 || c <= 0) return 1;
//不用记录任意大于20的递归结果
    if (a > 20 || b > 20 || c > 20) return w(20, 20, 20);
//查找备忘录
    if (f[a][b][c] != -1) return f[a][b][c];
    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];
}

注意:

1.之所以不用记录大于20的情况的递归结果,是因为他们的结果都是w(20,20,20),后面会记录到备忘录中。

!!!!!!!!!!!!!!:本题的输出格式一定要严格控制,否则答案会全错,空格不要多打或漏打

P1464 Function - 洛谷

http://www.dtcms.com/a/89374.html

相关文章:

  • Windows 10/11 使用 VSCode + SSH 免密远程连接 Ubuntu 服务器(指定端口)
  • matlab使用fmincon开加速
  • 光电效应及普朗克常数的测定数据处理 Python实现
  • 时隔多年,终于给它换了皮肤,并正式起了名字
  • 洛谷: P1443 马的遍历
  • OpenHarmony 入门——ArkUI 跨页面数据同步和应用全局单例的UI状态存储AppStorage 小结(三)
  • QML控件 - Slider
  • python脚本处理excel文件
  • 如何选择?Postman vs JMeter 对比介绍
  • zynq7020 最小ps环境速通
  • 开源大模型使用总结
  • Unity选择框(魔兽争霸3)
  • 文生图语义识别插件使用(controlnet)
  • STM32F103_LL库+寄存器学习笔记01 - 梳理CubeMX生成的LL库最小的裸机系统框架
  • immortalwrt一键istoreOS风格化
  • Unity射击游戏手榴弹笔记
  • 广告推荐算法 - 学习笔记
  • AL11和SM69 文件服务器中创建文件夹
  • 二叉树练习
  • 垃圾短信分类
  • 深度学习篇---卷积网络结构
  • 23种设计模式-创建型模式-单例
  • WPF 与 C# 开发深度剖析
  • 如何避免权限分配不合理导致的信息安全风险?
  • 【天梯赛】L2-012(实战反思代码实现)
  • 压测工具开发(一)——使用Qt Designer构建简单界面
  • Java编程思想:为何有时要将子类对象赋值给父类引用
  • 六级备考 词汇量积累(day11)
  • DNS域名解析服务
  • 【区块链安全 | 第一篇】密码学原理