当前位置: 首页 > 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 - 洛谷

相关文章:

  • 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 文件服务器中创建文件夹
  • 二叉树练习
  • 垃圾短信分类
  • 建设网站的需求分析/沈阳seo优化
  • 怎样才能建一个网站/免费网址注册
  • wordpress 还原备份数据库备份/seo需求
  • 小视频做网站怎么赚钱/seo黑帽教学网
  • 网站浮动广告怎么做/营销策划机构
  • 烟台做网站推广的公司哪家好/微信推广怎么弄