找工作准备刷题Day21 动态规划算法 (卡尔41期训练营 8.6)

news2024/11/24 18:32:33
  1. 上周有些事情回了趟老家,祝广大博友身体健康,多运动。
  2. 前面的贪心算法题目后面慢慢补,近期找到了一个实习,大概持续三个月,现在计划是白天工作,晚上下班以后运动运动+刷题。
  3. 要加强牛客网那种两小时3道题的刷题方式,限时刷题,贴近实际机考。

第一题  01背包问题

卡尔网题目链接:https://kamacoder.com/problempage.php?pid=1046


 

题解

#include <iostream>
#include <vector>
using namespace std;
//  0-1 bag 2D array solution
int bag_01_2DArray()
{
    int m, bagWeight;
    cin >> m >> bagWeight;
    vector<int> weight(m), value(m);
    for (int i = 0; i < m; i++)
        cin >> weight[i];
    for (int i = 0; i < m; i++)
        cin >> value[i];

    // initialize
    // vector<vector<int>> dp(m, vector<int>(bagWeight + 1, 0));
    vector<int> dp(bagWeight + 1, 0);

    for (int i = 0; i < m; i++)
    {
        // when j < weight[i], we do not change the value , so the loop ends
        for (int j = bagWeight; j >= weight[i]; j--)
        {
            dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
        }
    }

    cout << dp[bagWeight] << endl;

    return 0;
}

//  0-1 bag roll array solution
int bag_01_rollArray()
{
    int m, bagWeight;
    cin >> m >> bagWeight;
    vector<int> weight(m), value(m);
    for (int i = 0; i < m; i++)
        cin >> weight[i];
    for (int i = 0; i < m; i++)
        cin >> value[i];

    // initialize
    vector<vector<int>> dp(m, vector<int>(bagWeight + 1, 0));
    for (int j = weight[0]; j <= bagWeight; j++)
        dp[0][j] = value[0];

     for (int i = 1; i < m; i++)
    {
        for (int j = bagWeight; j >= 0; j--)
        {
            if (j < weight[i])
                dp[i][j] = dp[i - 1][j];
            else
                dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);
        }
    }

    cout << dp[m - 1][bagWeight] << endl;
    return 0;
}

int main()
{
    bag_01_rollArray();
    return 0;
}



第二题:Leetcode416. 分割等和子集

题目描述

解题思路

这个题目可以转换为01背包问题:背包大小为数组和的一半,每份材料的weight和value就是nums元素取值。请问这种情况下,dp[二分之一sum] 是否等于 二分之一sum,如果等于,那么就存在,都则就不存在。

题解

class Solution {
public:
    bool canPartition(vector<int>& nums) {
        int sum = accumulate(nums.begin(), nums.end(), 0);

        if (sum & 1)
            return false;

        const int target = sum >> 1;
        vector<int> dp(target + 1, 0);

        for (int i = 0; i < nums.size(); i++) {
            for (int j = target; j >= nums[i]; j--)
                dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);
        }
        return dp[target] == target;
    }
};

第三题:Leetcode238. 除自身以外数组的乘积

题目描述

解题思路

可以使用两个辅助数组,分别记录从左到右的乘积和从右到左的乘积,然后使用前缀积即可。

进一步,可以优化得到空间复杂度为O(1)的方案。

题解

class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        if (nums.empty())
            return {};
        const int len = nums.size();
        vector<int> ans(len, 1);
        for (int i = 1; i < len; i++) {
            ans[i] = ans[i - 1] * nums[i - 1];
        }

        int tmp = 1;
        for (int i = len - 2; i >= 0; i--) {
            tmp *= nums[i + 1];
            ans[i] *= tmp;
        }
        return ans;
    }
};

快排细节梳理

详见第一层 while循环后面的注释

写示例需要考虑多种情况,逆序、重复元素等等。

#include <iostream>
#include <vector>
using namespace std;

void quicksort(vector<int> &nums, const int left, const int right)
{
  if (left >= right)
    return;

  int base = nums[left];
  int l = left, r = right;
  while (l < r)
  {
    // 这里和下面,一定有一个地方要带上等于号
    // 物理意义是:base左边都小于 base值,右边都大于等于base值
    while (l < r && nums[r] >= base)
      r--;
    nums[l] = nums[r];

    while (l < r && nums[l] < base)
      l++;
    nums[r] = nums[l];
  }

  nums[l] = base;

  quicksort(nums, left, l - 1);

  quicksort(nums, l + 1, right);
}

int main()
{
  // char str[3];
  // std::cin>>str;

  std::cout << "hello world" << std::endl;
  vector<int> a{6, 5, 5, 4, 3, 3, 2, 1, -1, 10};
  quicksort(a, 0, a.size() - 1);
  for (auto n : a)
    cout << n << " ";
  cout << endl;
  std::cout << "hello world" << std::endl;
  return 0;
}

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

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

相关文章

【LVS】负载均衡--nat模式/实验

一、LVS运行原理 LVS:Linux Virtual Server &#xff0c;负载调度器&#xff0c;内核集成&#xff0c;章文嵩&#xff0c;阿里的四层 SLB(Server LoadBalance) 是基于LVSkeepalived 实现 LVS 官网 : http://www.linuxvirtualserver.org/ LVS 相关术语 VS: Virtual Server&…

poetry配置镜像

1.简介 poetry 是一个包管理和打包的工具。 在 Python 中&#xff0c;对于初学者来说&#xff0c;打包系统和依赖管理是非常复杂和难懂的。即使对于经验丰富的开发者&#xff0c;一个项目总是要同时创建多个文件&#xff1a; setup.py ,requirements.txt,setup.cfg , MANIFES…

Python爬虫入门:如何设置代理IP进行网络爬取或数据采集

在如今这个信息爆炸的时代&#xff0c;数据成为了最有价值的资源之一。而Python作为一种强大且易学的编程语言&#xff0c;被广泛应用于数据采集和网络爬虫中。然而&#xff0c;直接进行网络爬取往往会遇到IP被封禁的问题&#xff0c;因此使用代理IP就成了一个有效的解决方案。…

SpringBoot中读取配置的七种方法总结

❃博主首页 &#xff1a; 「码到三十五」 &#xff0c;同名公众号 :「码到三十五」&#xff0c;wx号 : 「liwu0213」 ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a…

Python | TypeError: unsupported operand type(s) for +=: ‘int’ and ‘str’

Python | TypeError: unsupported operand type(s) for : ‘int’ and ‘str’&#xff1a;深度解析 在Python编程中&#xff0c;遇到“TypeError: unsupported operand type(s) for : ‘int’ and ‘str’”这类错误通常意味着你尝试将一个整数&#xff08;int&#xff09;和…

基于OpenCV+MFC的视频读取与对象跟踪平台

基于OpenCVMFC的视频读取与对象跟踪平台 引言一、软件功能简介二、各个功能介绍1、视频操作模块功能介绍1.1打开视频1.2打开摄像头1.3开始录制1.4结束录制1.5暂停1.6恢复1.7关闭1.8还原 2、对象跟踪模块功能介绍2.1 BSM跟踪2.2 颜色跟踪2.3 光流跟踪2.4 KCF多对象跟踪 资源链接…

干货 | 2024步入数字化转型深水区,云原生业务稳定性如何保障(免费下载)

云原生业务的稳定性保障是一个涉及多个层面的复杂任务&#xff0c;以下是一些关键措施和策略&#xff0c;以确保云原生业务的高效稳定运行&#xff1a; 一、平台安全性评估与加固 云原生平台安全评估&#xff1a;对云原生平台&#xff08;如Kubernetes、Docker等&#xff09;…

数学建模--智能算法之鱼群算法

目录 核心原理 应用与实现 实现步骤 性能分析与改进 鱼群算法在解决哪些具体优化问题方面表现最佳&#xff1f; 如何根据不同的应用场景调整鱼群算法的参数设置以提高其性能&#xff1f; 鱼群算法与其他群体智能优化算法&#xff08;如遗传算法、粒子群优化&#xff09;…

鸿道Intewell工业操作系统ARM平台生态:飞腾E2000Q

在这个智能制造和工业自动化的新时代&#xff0c;工业操作系统不仅是技术进步的推动者&#xff0c;更是企业转型升级的加速器。随着全球工业的快速发展&#xff0c;对于能够适应复杂工业环境、满足多样化生产需求的工业操作系统的需求愈发迫切。 鸿道Intewell工业操作系统ARM…

【Java 第七篇章】异常处理

一、简介 Java 异常&#xff08;Exception&#xff09;是 Java 提供的一种用于处理程序中错误情况的机制。当 Java 程序运行时遇到无法继续执行的情况&#xff08;如数组越界、空指针引用等&#xff09;&#xff0c;就会抛出&#xff08;throw&#xff09;一个异常。异常处理是…

【书生大模型实战营第三期】入门岛 第2关 Python基础知识

1. 闯关任务 1 任务描述&#xff1a;实现一个 wordcount 函数&#xff0c;统计英文字符串中每个单词出现的次数。返回一个字典&#xff0c;key 为单词&#xff0c;value 为对应单词出现的次数。 上面是作者编写的代码&#xff0c;运行结果如下。 2. 闯关任务 2 任务描述&#x…

有限元和稀疏矩阵

对于大规模的有限元计算&#xff0c;系统的整体刚度矩阵是非常耗费内存的&#xff0c;以百万自由度为例&#xff0c;刚度矩阵K的大小为100万x100万&#xff0c;元素大小为双精度double&#xff0c;占用8 byte&#xff0c;那么K占用的内存为100万x100万x8 byte 8000G&#xff0…

【模版进阶】

模版进阶 小杨 一、非类型模版参数 模板参数分为类型形参与非类型形参。 类型形参即&#xff1a;出现在模板参数列表中&#xff0c;跟在class或者typename之类的参数类型名称。 非类型形参&#xff0c;就是用一个常量作为类(函数)模板的一个参数&#xff0c;在类(函数)模板中可…

mysql数据库触发器同步数据

首先检查数据源库是否支持触发器&#xff0c;show ENGINES&#xff0c;如果FEDERATED是NO&#xff0c;表示未开启&#xff0c;如需开启&#xff0c;再mysql配置文件中&#xff0c;添加federated配置到mysqld下面。 一、同服务器不同库触发器同步&#xff0c;这里只举例插入数据…

【用Java学习数据结构系列】探索Java集合框架的无尽秘密pro

看到这句话的时候证明&#xff1a;此刻你我都在努力 加油陌生人 个人主页&#xff1a;Gu Gu Study专栏&#xff1a;用Java学习数据结构系列 喜欢的一句话&#xff1a; 常常会回顾努力的自己&#xff0c;所以要为自己的努力留下足迹 喜欢的话可以点个赞谢谢了。 作者&#xff…

修改SpringBoot启动图标banner

方式一: 将图标文件命名为banner放在resources目录下 文本文件banner 图片banner 方式二&#xff1a;通过配置文件指定图标路径 指定文本图标&#xff1a;spring.banner.locationclasspath:相对于resources下的位置 ("classpath:"可以省略) 指定图片作为图标: sprin…

C语言——扫雷游戏

扫雷游戏通常是一个由方格组成的区域内进行的&#xff0c;其中随机分布着一定数量的地雷 。玩家的目标是通过点击方格来标记出所有地雷的位置&#xff0c;同时避免自己点到地雷而导致游戏失败。游戏开始时&#xff0c;玩家通常只能看到一部分方格&#xff0c;而其余的方格则需要…

消息框:tkinter.messagebox

文章目录 一、tkinter 简介二、tkinter 基础&#xff08;部件 布局管理器&#xff09;三、项目实战3.1、主循环&#xff1a;root.mainloop()3.2、手动摧毁窗口&#xff1a;root.destroy()3.3、布局管理器&#xff1a;pack3.4、布局管理器&#xff1a;grid3.5、布局管理器&…

【ML】transform 之 decoder 及其实现细节

【ML】transform 之 decoder 及其实现细节 1. decoder2. encoder 和decoder 之间是如何处理和传递讯息的&#xff1f;self-attention3. 查询&#xff08;Query&#xff09;、键&#xff08;Key&#xff09;、值&#xff08;Value&#xff09;是三个核心概念及其具体含义和计算方…

轻松应对大量订单:快递批量查询软件大揭秘

在日常生活和工作中&#xff0c;我们经常会遇到需要查询多个快递单号物流信息的情况&#xff0c;无论是电商卖家需要跟踪大量订单&#xff0c;还是消费者想要及时了解自己包裹的运输状态&#xff0c;手动逐一查询都显得既繁琐又低效。今天&#xff0c;我就向大家推荐一款效果非…