HDU1159——通用子序列,HDU1160——FatMouse的速度、HDU1165——艾迪的研究 II

news2024/12/26 22:49:48

HDU1159——通用子序列

题目描述

问题 - 1159 (hdu.edu.cn)

问题描述
给定序列的子序列是给定的序列,其中遗漏了一些元素(可能没有)。给定一个序列 X = <x1, x2, ..., xm>如果存在一个严格递增的 X 索引序列 <i1, i2, ..., ik>>,则另一个序列 Z = <z1, z2, ..., zk 是 X 的子序列,使得所有 j = 1,2,...,k, xij = zj。例如,Z = <a, b, f, c> 是 X = <a, b, c, f, b, c> 的子序列,索引序列为 <1, 2, 4, 6>。给定两个序列 X 和 Y,问题是找到 X 和 Y 的最大长度公共子序列的长度。
程序输入来自文本文件。文件中的每个数据集都包含两个字符串,分别表示给定的序列。序列之间由任意数量的空格分隔。输入数据正确无误。对于每组数据,程序都会在标准输出上打印从单独行的开头开始的最大长度公共子序列的长度。
 
样本输入
abcfbc abfcab
programming contest
abcd mnp
 
示例输出
4
2
0

运行代码

//https://acm.hdu.edu.cn/showproblem.php?pid=1159
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int longest(const string& str1, const string& str2) {
    int m = str1.length();
    int n = str2.length();
    vector<vector<int>> dp(m + 1,vector<int>(n + 1, 0));
    for (int i = 1; i <= m; i++) {
        for (int j = 1; j <= n; j++) {
            if (str1[i - 1] == str2[j - 1]) {
                dp[i][j] = dp[i - 1][j - 1] + 1;
            }
            else {
                dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
            }
        }
    }
    return dp[m][n];
}

int main() {
    string str1, str2;
    while (cin >> str1 >> str2) {
        cout << longest(str1, str2) << endl;
    }
    return 0;
}

代码思路

使用动态规划的思想来求解两个字符串的最长公共子序列(Longest Common Subsequence,LCS)的长度。动态规划是一种通过把原问题分解为相对简单的子问题,并保存子问题的解来避免重复计算,从而解决复杂问题的方法。

  1. 参数设置:该函数接收两个字符串str1str2作为参数,代表要计算最长公共子序列的两个序列。

  2. 初始化动态规划数组:首先获取两个字符串的长度,分别存储在变量mn中。创建一个二维向量dp,大小为(m + 1) x (n + 1),并初始化为全零。这里的dp[i][j]表示str1的前i个字符和str2的前j个字符的最长公共子序列的长度。

  3. 动态规划过程:使用两个嵌套的循环遍历两个字符串的所有可能子序列组合。如果str1[i - 1](即str1的第i个字符)和str2[j - 1](即str2的第j个字符)相等,说明找到了一个公共字符,此时dp[i][j]的值应该是dp[i - 1][j - 1] + 1,也就是两个字符串都去掉当前这个公共字符后的最长公共子序列长度加一。如果两个字符不相等,那么dp[i][j]的值应该是dp[i - 1][j]dp[i][j - 1]中的较大值。这是因为如果当前字符不相等,最长公共子序列要么来自于不考虑str1的当前字符(即dp[i - 1][j]),要么来自于不考虑str2的当前字符(即dp[i][j - 1])。

  4. 返回结果:最终,dp[m][n]就存储了str1str2的最长公共子序列的长度,函数返回这个值。

HDU1160——FatMouse的速度

题目描述

问题 - 1160 (hdu.edu.cn)

问题描述
FatMouse认为,老鼠越胖,它跑得越快。为了反驳这一点,你想要获取一组老鼠的数据,并将这些数据的尽可能大的子集放入一个序列中,以便权重增加,但速度下降。
输入
输入包含一堆鼠标的数据,每行一只鼠标,在文件末尾终止。特定鼠标的数据将由一对整数组成:第一个表示其大小(以克为单位),第二个表示其速度(以厘米/秒为单位)。两个整数都在 1 到 10000 之间。每个测试用例中的数据将包含最多 1000 只小鼠的信息。两只老鼠可能具有相同的重量、相同的速度,甚至相同的重量和速度。
输出
您的程序应输出一系列数据行;第一行应包含数字 n;剩下的 N 行都应包含一个正整数(每个行代表一只老鼠)。如果这 n 个整数是 m[1]、m[2],..., m[n],那么一定是W[m[1]] < W[m[2]] < ...< W[m[n]]和S[m[1]] > S[m[2]] > ...> S[m[n]]为了使答案正确,n 应尽可能大。所有的不平等都是严格的:重量必须严格增加,速度必须严格减少。对于给定的输入,可能有许多正确的输出,您的程序只需要找到一个。
 

运行代码

#include <iostream>
#include <vector>
#include <algorithm>
#include <stack>

struct Node {
    int w, v, num;
    Node(int w, int v, int num) : w(w), v(v), num(num) {}
};

bool compare(const Node& a, const Node& b) {
    return a.w < b.w || (a.w == b.w && a.v > b.v);
}

int main() {
    std::vector<Node> nodes;
    int w, v;
    while (std::cin >> w >> v) {
        nodes.emplace_back(w, v, nodes.size() + 1);
    }
    std::sort(nodes.begin(), nodes.end(), compare);

    int n = nodes.size();
    std::vector<int> dp(n, 1);
    std::vector<int> pre(n, -1);
    int maxLen = 0, endIndex = 0;
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < i; ++j) {
            if (nodes[j].w < nodes[i].w && nodes[j].v > nodes[i].v && dp[i] < dp[j] + 1) {
                dp[i] = dp[j] + 1;
                pre[i] = j;
            }
        }
        if (dp[i] > maxLen) {
            maxLen = dp[i];
            endIndex = i;
        }
    }

    std::cout << maxLen << std::endl;
    std::stack<int> st;
    while (endIndex!= -1) {
        st.push(endIndex);
        endIndex = pre[endIndex];
    }
    while (!st.empty()) {
        std::cout << nodes[st.top()].num << std::endl;
        st.pop();
    }
    return 0;
}

代码思路

  1. 输入与存储:使用 while (std::cin >> w >> v) 循环不断读取输入的重量和价值数据,将其创建为 Node 结构体对象,并存储在 std::vector<Node> nodes 中。每个 Node 结构体包含重量 w、价值 v 和编号 num

  2. 排序:对 nodes 容器中的物品按照重量 w 升序排列,如果重量相等,则按照价值 v 降序排列。这样的排序是为了方便后续在遍历物品时,只需要考虑前面的物品是否满足条件即可,因为后面物品的重量一定大于等于前面的物品重量。

  3. 动态规划求解最长子序列:创建两个长度为 nn 为物品数量)的辅助数组 dp 和 pre。其中 dp[i] 表示以第 i 个物品结尾的最长子序列长度,pre[i] 表示最长子序列中第 i 个物品的前一个物品在 nodes 中的索引。两层循环遍历物品:

    • 内层循环遍历 i 之前的物品 j,如果物品 j 的重量小于物品 i 的重量且物品 j 的价值大于物品 i 的价值,说明物品 j 可以作为物品 i 的前驱物品。如果此时以物品 i 结尾的子序列长度小于以物品 j 结尾的子序列长度加一,就更新 dp[i] 和 pre[i]
    • 外层循环遍历每个物品 i
    • 在遍历过程中,记录最长子序列的长度 maxLen 和最长子序列最后一个物品的索引 endIndex
  4. 输出结果:首先输出最长子序列的长度 maxLen。然后使用栈 std::stack<int> st 来逆序输出最长子序列中物品的编号。从最长子序列的最后一个物品索引 endIndex 开始,不断根据 pre 数组找到前一个物品的索引,将索引压入栈中。最后依次弹出栈中的索引,根据索引在 nodes 中找到对应的物品编号并输出。

HDU1165——艾迪的研究 II

题目描述

问题 - 1165 (hdu.edu.cn)

运行代码

#include <iostream>

const int M = 1000005;
int dp[4][M];

void init() {
    for (int i = 0; i < M; ++i) {
        dp[0][i] = i + 1;
        dp[1][i] = i + 2;
        dp[2][i] = 2 * i + 3;
    }
    dp[3][0] = 5;
    for (int i = 1; i <= 24; ++i) dp[3][i] = 2 * dp[3][i - 1] + 3;
}

int main() {
    init();
    int m, n;
    while (std::cin >> m >> n) {
        std::cout << dp[m][n] << '\n';
    }
    return 0;
}

代码思路

  1. 定义常量和数组

    • 定义常量 M 为 1000005,用于表示数组的大小上限。
    • 定义二维数组 dp[4][M],用于存储阿克曼函数在不同参数下的计算结果。
  2. 初始化函数 init():使用循环初始化 dp 数组:

    • 当 m = 2 时,dp[2][i] = 2 * i + 3,即 A(2, n) = 2 * n + 3
    • 当 m = 1 时,dp[1][i] = i + 2,即 A(1, n) = n + 2
    • 当 m = 0 时,dp[0][i] = i + 1,即 A(0, n) = n + 1
    • 对于 m = 3 的情况单独处理,先设置 dp[3][0] = 5,然后通过循环计算 dp[3][i] = 2 * dp[3][i - 1] + 3,即 A(3, n) 的值是根据前一个 n 的值递推得到的,并且限制 n 的范围在 24 以内。
  3. 主函数 main()

    • 调用 init() 函数进行初始化操作。
    • 使用 while (std::cin >> m >> n) 循环不断读取输入的 m 和 n 的值。
    • 对于每一组输入的 m 和 n,直接输出 dp[m][n],即阿克曼函数 A(m, n) 的值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2064104.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++ Primer Plus习题】2.7

问题: 解答: #include <iostream> using namespace std;void print(int hour, int minute) {cout << "Time:" << hour << ":" << minute << endl; }int main() {int hour0;int minute 0;cout << "请输入…

NumExpr加速计算(numpy表达式)

文章目录 一、简介二、安装三、函数详解四、性能评估 Python 性能优化&#xff1a;NumExpr Numba CuPy 一、简介 numexpr&#xff08;全称&#xff1a;numpy expression&#xff09;&#xff1a;用于在 NumPy 表达式上快速执行元素级运算的 Python 加速库。 优势&#xff1…

软考高级科目怎么选?

首先上图 从图片中可以看出来&#xff0c;在软件开发中考试方向为程序员-软件设计师-系统架构师或者系统分析师。 系统分析师与系统架构师工作内容&#xff1a; 系统分析师&#xff1a;在信息系统项目开发过程中负责制定信息系统需求规格说明书和项目开发计划、指导和协调信息…

在网站文章中,‌<br>标签对SEO的影响及优化策略

在网页设计和内容创作中&#xff0c;‌<br>标签常被用于实现文本的换行显示。‌然而&#xff0c;‌对于关注SEO&#xff08;‌搜索引擎优化&#xff09;‌的网站管理员和内容创作者来说&#xff0c;‌<br>标签的使用却需要更加谨慎。‌这是因为<br>标签对SEO…

Linux系统编程全面学习

应用层&#xff1a;写一个QT可执行程序、一个C程序 驱动层&#xff1a;写一个LED、蜂鸣器、pwm驱动 硬件层&#xff1a;焊接、layout Linux系统介于应用层和驱动层之间&#xff0c;Linux系统会向应用层提供接口&#xff0c;学习使用的基本是Linux内核向用户提供的接口或者可以…

理解Tomcat的IP绑定与访问控制

在使用Spring Boot开发应用时&#xff0c;内置的Tomcat容器提供了灵活的网络配置选项。特别是&#xff0c;当计算机上有多个网卡时&#xff0c;如何配置server.address属性显得尤为重要。本文将详细探讨不同IP配置对Tomcat服务访问的影响。 多网卡环境下的IP配置 假设你的计算…

java 8种基础数据类型

1、数据范围 2、各个类型转换 实线转换&#xff1a;无信息丢失的自动转换&#xff0c;反方向需要强制类型转换&#xff0c;如&#xff08;int) 虚线转换&#xff1a;可能存在精度丢失 精度丢失示例如下&#xff1a; long l 123456787654321L; float f l; System.out.prin…

框架漏洞大全【万字总结】

文章目录 常见语言开发框架&#xff1a;Thinkphp远程代码执行5.0.23 rce介绍影响版本复现 CNVD-2018-24942介绍影响版本复现 任意文件包含包含日志-3.2x介绍影响版本复现 包含语言&#xff08;QVD-2022-46174&#xff09;介绍影响版本复现 sql注入漏洞(5.0.x)介绍影响版本复现 …

太上老君的“三味真火”也可以提升3D NAND可靠性!

《西游记》中孙悟空因在太上老君的炼丹炉中历经九九八十一难&#xff0c;最终炼就了一双能够洞察一切妖魔鬼怪真身的“火眼金睛”。这双神奇的眼睛&#xff0c;仿佛预示着一种古老的智慧——通过火的考验&#xff0c;可以淬炼出更加坚韧的灵魂。 而在现代科技的洪流中&#xff…

软件测试-自动化测试

自动化测试 测试人员编写自动化测试脚本&#xff0c;维护并解决自动化脚本问题 自动化的主要目的就是用来进行回归测试 回归测试 常见面试题 ⾃动化测试能够取代人工测试吗&#xff1f; ⾃动化测试不⼀定⽐人工测试更能保障系统的可靠性&#xff0c;⾃动化测试是测试⼈员手…

vue2项目从0到1记录

脚手架需要安装完 npm install -g vue/cli1. 使用脚手架创建项目 vue create 项目名2. 引入样式重置normalize.css插件 // 统一浏览器样式 安装&#xff1a;npm install --save normalize.css 引入&#xff1a;import normalize.css/normalize.css3. 根据部署环境判断是否要…

MyBatis[进阶]

大纲: 动态SQL查询 留言板 1. 动态SQL 1.1 <if> 我们都注册过一些信息,有的信息是非必填项,改如何实现呢? 这个时候就需要使⽤动态标签来判断了 ⽐如添加的时候性别gender为⾮必填字段&#xff0c;具体实现如 下&#xff1a; 注解: 如果性别为空: 如果性别不为空:…

你真的会用大模型吗,探索提示词工程的魅力

相信在这一两年内&#xff0c;每个人都尝试使用了各种大模型。不知大家有没有发现&#xff0c;它们的质量参差不齐&#xff0c;回答的内容也不一定准确。随着人工智能技术的快速发展&#xff0c;越来越多的模型被开发出来并用于各种应用&#xff0c;但并非所有模型都能够提供可…

Leetcode每日刷题之904.水果成篮

1.题目解析 本题的题目要求较长&#xff0c;不过理解起来较为简单&#xff0c;就是在给定数组内找出最长子数组&#xff0c;并且该最长子数组只能有两种数字&#xff0c;最后返回该符合条件的最长子数组的长度即可 题目来源&#xff1a;904.水果成篮 2.算法原理 本题的核心是找…

组件提前渲染

问题&#xff1a; 组件正常引入并使用的过程中&#xff0c;出现组件第一次渲染不显示&#xff0c;只有再次刷新页面才显示的问题 <el-table-column label"图纸规定" align"center" prop"tzgd" v-if"mbform.zbzd.tzgd" width"…

动手实现基于Reactor模型的高并发Web服务器(一):epoll+多线程版本

系统流程概览 main函数 对于一个服务器程序来说&#xff0c;因为要为外部的客户端程序提供网络服务&#xff0c;也就是进行数据的读写&#xff0c;这就必然需要一个 socket 文件描述符&#xff0c;只有拥有了文件描述符 C/S 两端才能通过 socket 套接字进行网络通信&#xff0…

【深海王国】小学生都能玩的单片机!番外2:Arduino控制其他元器件

Hi٩(๑ ^ o ^ ๑)۶, 各位深海王国的同志们&#xff0c;早上下午晚上凌晨好呀~辛勤工作的你今天也辛苦啦 (o゜▽゜)o☆ 今天大都督为大家带来单片机的新番外系列——小学生都能玩的单片机&#xff01;番外2&#xff1a;Arduino控制其他元器件&#xff0c;带你学习如何使用Ard…

性能测试面试问答题

1、性能测试怎么测试&#xff1f; 性能测试其实就是通过自动化工具模拟多种正常、峰值以及异常负载来对系统的各项性能指标进行测试。负载测试和压力测试都属于性能测试&#xff0c;二者可结合使用。 性能指标主要有平均响应时间、90%响应时间、吞吐量、吞吐率&#xff0c;每…

基于SpringBoot的私房菜定制上门服务系统的设计与实现pf

TOC springboot512基于SpringBoot的私房菜定制上门服务系统的设计与实现pf 第1章 绪论 1.1 课题背景 二十一世纪互联网的出现&#xff0c;改变了几千年以来人们的生活&#xff0c;不仅仅是生活物资的丰富&#xff0c;还有精神层次的丰富。在互联网诞生之前&#xff0c;地域…

图书项目要点

一、搭建项目 使用tarojs/cli进行搭建 taro init [项目名] 二、具体页面 页面声明&#xff1a; 在【app.config.ts】中对主页面进行声明&#xff1a;组件页面可以不用声明 pages: ["pages/index/index",pages/user/index,pages/book/index,], tabbar制作&…