华为OD机试题中 动态规划和贪心算法例题

这篇具有很好参考价值的文章主要介绍了华为OD机试题中 动态规划和贪心算法例题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


在 ACM 比赛中,有许多常见的编程算法和数据结构经常被使用。本系列博客会罗列各种常见算法,以及其代表性例题。

这部分内容可以用于类似华为 OD 机考学习。

动态规划

动态规划是一种将复杂问题分解为简单子问题并使用子问题的解来构建更大问题的方法。它通常用于解决最长公共子序列、背包问题、最优化问题等。

题目:最长递增子序列

描述

给定一个整数序列,找出其中最长的递增子序列的长度。递增子序列是指序列中的元素按照非降序排列,并且元素之间可以不连续。

输入

输入的第一行包含一个整数 n( 1 ≤ n ≤ 1 0 3 1 ≤ n ≤ 10^3 1n103),表示序列的长度。
接下来一行包含 n 个整数,表示序列中的元素。

输出

输出一个整数,表示最长的递增子序列的长度。

注意

子序列不要求连续,只要求元素按照非降序排列即可。
序列中的元素可能存在重复。

示例

输入

8
2 4 3 5 1 7 6 9

输出

5

解释
在给定序列中,最长的递增子序列是 2 3 5 7[6] 9,长度为 5。

AC 题解代码

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

using namespace std;

int longestIncreasingSubsequence(vector<int>& nums) {
    int n = nums.size();
    vector<int> dp(n, 1); // dp[i]表示以第i个元素结尾的最长递增子序列的长度

    for (int i = 1; i < n; i++) {
        for (int j = 0; j < i; j++) {
            if (nums[i] > nums[j]) {
                dp[i] = max(dp[i], dp[j] + 1);
            }
        }
    }

    return *max_element(dp.begin(), dp.end());
}

int main() {
    int n;
    cin >> n;

    vector<int> nums(n);
    for (int i = 0; i < n; i++) {
        cin >> nums[i];
    }

    int result = longestIncreasingSubsequence(nums);
    cout << result << endl;

    return 0;
}

贪心算法

贪心算法是一种每次选择当前最优解的策略。它通常用于优化问题,例如最短路径、最小生成树等。

题目:零钱兑换

描述

给定不同面额的硬币 coins 和一个总金额 amount,编写一个函数来计算可以凑成总金额所需的最少的硬币数量。如果无法凑成总金额,则返回-1。

假设每种硬币的数量是无限的。

输入

输入由两行组成。
第一行包含一个整数 n( 1 ≤ n ≤ 1 0 3 1 ≤ n ≤ 10^3 1n103),表示硬币的种类数。
第二行包含 n 个整数,表示每种硬币的面额( 1 ≤ c o i n s [ i ] ≤ 1 0 4 1 ≤ coins[i] ≤ 10^4 1coins[i]104)。

接下来一行包含一个整数 amount( 1 ≤ a m o u n t ≤ 1 0 5 1 ≤ amount ≤ 10^5 1amount105),表示要凑成的总金额。

输出

输出一个整数,表示凑成总金额所需的最少硬币数量。如果无法凑成总金额,则输出-1。

注意

如果没有硬币面额可以组成总金额,返回-1。
如果存在多种组合方式,返回最少硬币数量的方案。

示例

输入

4
1 2 5 10
15

输出

2

解释
使用面额为 10、5 的硬币,可以凑成总金额 15,所需的最少硬币数量为 2。

AC 题解代码

#include <iostream>
#include <vector>
#include <climits>
#include <algorithm>

using namespace std;

int coinChange(vector<int>& coins, int amount) {
    vector<int> dp(amount + 1, INT_MAX);
    dp[0] = 0;

    for (int i = 1; i <= amount; i++) {
        for (int j = 0; j < coins.size(); j++) {
            if (coins[j] <= i && dp[i - coins[j]] != INT_MAX) {
                dp[i] = min(dp[i], dp[i - coins[j]] + 1);
            }
        }
    }

    return dp[amount] == INT_MAX ? -1 : dp[amount];
}

int main() {
    int n;
    cin >> n;

    vector<int> coins(n);
    for (int i = 0; i < n; i++) {
        cin >> coins[i];
    }

    int amount;
    cin >> amount;

    int result = coinChange(coins, amount);
    cout << result << endl;

    return 0;
}

欢迎继续学习

🔈🔈 特别提醒,订阅专栏前一定要看好题解语言哦~文章来源地址https://www.toymoban.com/news/detail-792326.html

  • 华为OD机考 Python https://blog.csdn.net/hihell/category_12199275.html
  • 华为OD机考 C++ https://blog.csdn.net/hihell/category_12199283.html
  • 华为OD机考真 C 语言 https://blog.csdn.net/hihell/category_12225286.html
  • 华为OD机考 JAVA https://blog.csdn.net/hihell/category_12201821.html
  • 华为OD机考 JS https://blog.csdn.net/hihell/category_12201825.html
  • 华为OD机考 Golang https://blog.csdn.net/hihell/category_12231589.html

到了这里,关于华为OD机试题中 动态规划和贪心算法例题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 华为OD机试 - 最少数量线段覆盖| 机试题算法思路 【2023】

    华为OD机试 - 简易压缩算法(Python) | 机试题算法思路 【2023】 华为OD机试题 - 获取最大软件版本号(JavaScript) 华为OD机试 - 猜字谜(Python) | 机试题+算法思路 【2023】 华为OD机试 - 删除指定目录(Python) | 机试题算法思路 【2023】 华为OD机试 - 自动曝光(Python) | 机试题算法

    2023年04月25日
    浏览(44)
  • 2023华为OD机试真题【区间交叠/贪心算法】【Python Java】

    给定坐标轴上的一组线段,线段的起点和终点均为整数并且长度不小于1,请你从中找到最少数量的线段,这些线段可以覆盖住所有线段。 输入描述 第一行输入为所有线段的数量,不超过10000,后面每行表示一条线段,格式为”x,y”, x和y 分别表示起点和终点,取值范围是

    2024年02月13日
    浏览(47)
  • 【华为OD机试】叠积木(贪心算法—Java&Python&C++&JS实现)

    本文收录于专栏:算法之翼 本专栏所有题目均包含优质解题思路,高质量解题代码(JavaPythonC++JS分别实现),详细代码讲解,助你深入学习,深度掌握!

    2024年04月13日
    浏览(42)
  • 2023华为OD机试真题【区间交叠/贪心算法】【Python Java C++】

    给定坐标轴上的一组线段,线段的起点和终点均为整数并且长度不小于1,请你从中找到最少数量的线段,这些线段可以覆盖住所有线段。 输入描述 第一行输入为所有线段的数量,不超过10000,后面每行表示一条线段,格式为”x,y”, x和y 分别表示起点和终点,取值范围是

    2024年02月13日
    浏览(56)
  • 华为OD机试 -矩阵扩散(Java) | 机试题+算法思路+考点+代码解析 【2023】

    存在一个mn的二维数组,其成员取值范围为0或1。其中值为1的成员具备扩散性,每经过1S,将上下左右值为0的成员同化为1。二维数组的成员初始值都为0,将第[i,j]和[k,l]两个个位置上元素修改成1后,求矩阵的所有元素变为1需要多长时间。 输入描述: 输出数据中的前2个数字表

    2024年02月16日
    浏览(61)
  • 【华为OD机试】芯片资源限制(贪心算法—Java&Python&C++&JS实现)

    本文收录于专栏:算法之翼 本专栏所有题目均包含优质解题思路,高质量解题代码(JavaPythonC++JS分别实现),详细代码讲解,助你深入学习,深度掌握!

    2024年04月11日
    浏览(55)
  • 华为OD机试 - 五键键盘(JavaScript) | 机试题+算法思路+考点+代码解析 【2023】

    有一个特殊的五键键盘 上面有 A 、 Ctrl-C 、 Ctrl-X 、 Ctrl-V 、 Ctrl-A A 键在屏幕上输出一个字母 A Ctrl-C 将当前所选的字母复制到剪贴板 Ctrl-X 将当前选择的字母复制到剪贴板并清空所选择的字母 Ctrl-V 将当前剪贴板的字母输出到屏幕 Ctrl-A 选择当前屏幕中所有字母 注意: 剪贴板

    2024年02月09日
    浏览(42)
  • 253.【华为OD机试】田忌赛马(贪心算法-Java&Python&C++&JS实现)

    🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(JavaPythonC++JS分别实现),详细代码讲解,助你深入学习,深度掌握!

    2024年03月24日
    浏览(108)
  • 【华为OD机试真题 C++】1118 - 最大利润 | 机试题+算法思路+考点+代码解析

    🍂个人博客首页: KJ.JK   🍂专栏介绍: 华为OD机试真题汇总,定期更新华为OD各个时间阶段的机试真题,每日定时更新,本专栏将使用Python语言进行更新解答,包含真题,思路分析,代码参考,欢迎大家订阅学习 🎃题目描述 商人经营一家店铺, 有number种商品,由于仓库限

    2024年02月04日
    浏览(65)
  • 华为OD机试 -矩阵最大值(Java) | 机试题+算法思路+考点+代码解析 【2023】

    给定一个仅包含0和1的N*N二维矩阵,请计算二维矩阵的最大值,计算规则如下: 1、 每行元素按下标顺序组成一个二进制数(下标越大越排在低位),二进制数的值就是该行的值。矩阵各行值之和为矩阵的值。 2、允许通过向左或向右整体循环移动每行元素来改变各元素在行中

    2024年02月13日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包