[Algorithm][综合训练][哈夫曼编码][abb][旋转字符串]详细讲解

embedded/2025/1/16 10:56:55/

目录


1.哈夫曼编码

1.题目链接


2.算法原理详解 && 代码实现

  • 哈夫曼编码核心 -> 让出现次数越多的字符编出来的码越短

    • 是什么:最优的压缩方式
    • 怎么用
      • 统计每个字符的频次
      • 根据频次构建最优二叉树
      • 根据最优二叉树编码
        请添加图片描述
  • 解法:利用小根堆,一边构建树,一边计算长度

    #include <iostream>
    #include <vector>
    #include <queue>
    using namespace std;typedef long long LL;int main()
    {int n = 0;cin >> n;priority_queue<LL, vector<LL>, greater<>> heap;while(n--){LL x = 0;cin >> x;heap.push(x);}// 构建最优二叉树/哈夫曼树LL ret = 0;while(heap.size() > 1){LL x1 = heap.top();heap.pop();LL x2 = heap.top();heap.pop();heap.push(x1 + x2);ret += x1 + x2;}cout << ret << endl;return 0;
    }
    

abb_60">2.abb

1.题目链接


2.算法原理详解 && 代码实现

  • 解法:动态规划 + 哈希表 -> 子序列问题 -> 以某个位置为结尾来分析问题
    • 状态表示dp[i]:以i位置元素为结尾的所有的子序列中,有多少个_xx

    • 状态转移方程
      请添加图片描述

    • 返回值:整张dp表的和

    #include <iostream>
    #include <string>
    using namespace std;int main()
    {int n = 0;string str;cin >> n >> str;long long f[26] = { 0 };long long g[26] = { 0 };long long ret = 0;for(int i = 0; i < n; i++){// DPint x = str[i] - 'a';ret += f[x];// Updatef[x] = f[x] + i - g[x];g[x] = g[x] + 1;}cout << ret << endl;return 0;
    }
    

3.旋转字符串

1.题目链接


2.算法原理详解 && 代码实现

  • 解法一:暴力模拟 --> 每次旋转⼀下A字符串,看看是否和B字符串相同
  • 解法二:规律 + string接口
    • 如果A能够旋转之后得到B的话,在A倍增之后的新串中,⼀定是可以找到B的
    • 因此,仅需让A倍增,然后查找B即可
    bool solve(string A, string B)
    {if(A.size() != B.size()){return false;}return (A + A).find(B) != string::npos;
    }
    

http://www.ppmy.cn/embedded/102908.html

相关文章

51单片机——按键控制

1、按键介绍 轻触按键&#xff1a;相当于是一种电子开关&#xff0c;按下时开关接通&#xff0c;松开时开关断开&#xff0c;实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通和断开。 2、按键的抖动 对于机械开关&#xff0c;当机械触点断开、闭合时&#xff0c;由于…

数据结构——栈和队列

目录 栈和队列 1.栈FILO 顺序栈&#xff1a;&#xff08;空增栈&#xff09; 链式栈 2.队列 栈和队列 栈和队列是特殊的表状结构 表可以在任意位置插入和删除 栈和队列只允许在固定位置插入和删除 1.栈FILO 先进后出&#xff0c;后进先出 栈顶&#xff1a;允许入栈出栈的…

一款支持固定区域,固定尺寸大小重复截图的软件

WinSnap是一款功能强大的屏幕截图软件&#xff0c;可以实现对固定区域&#xff0c;固定尺寸大小区域重复截图&#xff0c;适用于日常截图需求和专业用户进行屏幕截图和图像编辑。通过设置快捷键&#xff0c;方便快速重复截图固定区域固定大小。它支持捕捉整个屏幕、活动窗口、选…

Redis 实现哨兵模式

目录 1 哨兵模式介绍 1.1 什么是哨兵模式 1.2 sentinel中的三个定时任务 2 配置哨兵 2.1 实验环境 2.2 实现哨兵的三条参数&#xff1a; 2.3 修改配置文件 2.3.1 MASTER 2.3.2 SLAVE 2.4 将 sentinel 进行备份 2.5 开启哨兵模式 2.6 故障模拟 3 在整个架构中可能会出现的问题 …

Docker 的简介

Docker 的简介 为什么会有 Docker环境一致性问题提高资源利用率和可移植性快速部署和伸缩简化管理和维护版本控制和回滚 Docker 的历史dotCloud 时代&#xff08;2010年前&#xff09;Docker 诞生&#xff08;2010-2013&#xff09;快速发展与开源&#xff08;2013-2014&#x…

智能听诊器:开启宠物健康管理新维度

在宠物医疗保健的快速演进中&#xff0c;智能听诊器作为一项创新技术&#xff0c;正不断拓展其应用边界&#xff0c;为宠物健康管理带来全方位的革新。这些延伸将如何塑造宠物健康的未来呢&#xff01; 智能数据分析与机器学习 智能听诊器的未来将更加依赖于先进的数据分析和…

深入解析财务报表:掌握重要财务指标的技巧

一、概述 财务报表中有大量信息&#xff0c;如果我们在分析时缺乏明确的方向或忽视了重点&#xff0c;就很容易在繁杂的数据中迷失方向。本文将深入探讨财务报表中的几个重要指标&#xff0c;帮助大家更有针对性地理解这些内容&#xff0c;包括如何分析资产负债率、解读净资产…

keil编译输出的信息program size含义,以及个人使用中的编译内存溢出问题

keil编译后输出的信息含义 data对应的是片内的RAM&#xff0c;xdata对应的是程序中片外扩展的存储器上需要占用的容量&#xff0c;code是编写的程序占用单片机片内的存储程序ROM上的容量。 编译中发现错误 上图中的data值占用了147字节&#xff0c;超过了128字节。 一般解决…