秋招突击——6/26~6/27——复习{二维背包问题——宠物小精灵之收服}——新作{串联所有单词的字串}

文章目录

    • 引言
    • 复习
      • 二维背包问题——宠物小精灵之收服
        • 个人实现
          • 重大问题
        • 滚动数组优化实现
    • 新作
      • 串联所有单词的字串
        • 个人实现
        • 参考实现
    • 总结

引言

  • 今天应该是舟车劳顿的一天,头一次在机场刷题,不学习新的东西了,就复习一些之前学习的算法了。

复习

二维背包问题——宠物小精灵之收服

以往的分析链接

  • 第一次分析
  • 第二次分析

在这里插入图片描述
在这里插入图片描述

个人实现
  • 这是第二次在做这道题,这是一个单纯的二维背包问题,需要理清楚最后是要你输出什么类型,先给20分钟在开发网站上尝试一下,然后在来具体分析。
#include <iostream>
#include <cstring>
#include <limits.h>using namespace std;const int N = 1010,M = 550,K = 110;// 其中的N表示的精灵球的数量,M是体力值,K是野生精灵的数量int nt[K],mt[K];
int f[K][N][M];int n,m,k;int main(){cin>>n>>m>>k;for(int i = 1;i <= k;i ++){cin>>nt[i]>>mt[i];}// 二维背包问题计算状态转移矩阵变化的int res = f[k][n][m-1];for(int i = 1;i <= k;i ++){// 针对第i个物体,只有判定抓或者不抓两种情况for(int j = 0;j <= n;j ++){// 遍历合法情况下的精灵球数量for(int l = 0 ;l <= m - 1;l ++){// 遍历合法情况下的体力值,注意上下确界,体力值不能消耗完// 两种情况,抓或者是不抓,对应需要处理边界值的情况if (j-nt[i] >= 0 && l-mt[i] >= 0)f[i][j][l] = max(f[i-1][j][l],f[i-1][j-nt[i]][l-mt[i]] + 1);elsef[i][j][l] = f[i-1][j][l];res = max(f[i][j][l],res);}}}cout<<res<<" ";// 第二个维度进行判定for(int i = 1;i <= k;i ++) {// 针对第i个物体,只有判定抓或者不抓两种情况for (int j = 1; j <= n; j++) {// 遍历合法情况下的精灵球数量for (int l = 1; l <= m - 1; l++) {if (f[i][j][l] == 2)cout<<"("<<i<<","<<j<<","<<l<<"): "<<f[i][j][l]<<" "<<endl;}}}int cost_health = m;for(int i = 0;i < m;i ++){if(f[k][n][i] == res)cost_health = min(cost_health,i);}cout<<m - cost_health;
}
重大问题
  • 这里有一个重要的发现,就是就是如果使用原始的,不加滚动数组优化的,就得保证每一层之间都能够将信息传递下来,不能因为不满足条件,就直接跳过。
    • 这个bug看了好久,才发现,中间是断层的,之前的决策信息是没有传递下来的,所以最后一行都是空的。

在这里插入图片描述

滚动数组优化实现
  • 这里可以使用滚动数组进行优化实现,因为每一次都是从前往后遍历,然后用的是之前的数据。如果使用从后往前遍历,就不需要修改上一个数组了,这里讲的有点模糊,有点混乱。这里直接看我之前的分析吧,具体如下
  • 背包模板——采药问题
  • 设计公式推导,不过不重要,很好记:完全背包问题——买书
  • 这个是公式推导的第二部分:完全背包问题——买书2

最终实现代码如下

  • 实现起来真简单,不得不说,确实厉害!
#include <iostream>
#include <cstring>
#include <limits.h>using namespace std;const int N = 1010,M = 550,K = 110;// 其中的N表示的精灵球的数量,M是体力值,K是野生精灵的数量int nt[K],mt[K];
int f[N][M];int n,m,k;int main(){cin>>n>>m>>k;for(int i = 1;i <= k;i ++){cin>>nt[i]>>mt[i];}// 二维背包问题计算状态转移矩阵变化的for(int i = 1;i <= k;i ++){// 针对第i个物体,只有判定抓或者不抓两种情况for(int j = n;j >= nt[i];j --){// 遍历合法情况下的精灵球数量for(int l = m - 1 ;l >= mt[i];l --){f[j][l] = max(f[j][l],f[j-nt[i]][l-mt[i]] + 1);}}}int res = f[n][m-1];cout<<res<<" ";int cost_health = m;for(int i = 0;i < m;i ++){if(f[n][i] == res)cost_health = min(cost_health,i);}cout<<m - cost_health;
}

新作

串联所有单词的字串

  • 题目链接
    在这里插入图片描述
    在这里插入图片描述
  • 这题跳了好几次,后面好几题都做了,终于是他了,两天做这道题。

重点

  • words是由若干个子字符串构成的,然后可以按照任意顺序进行拼接,形成n!个字符串,数量很大
  • 每一个字符字串进行匹配查找拼接,这又是一个问题的。每个都是n平方的时间复杂度,根本做不了的。n平方 * n!,这个时间复杂度太高了。根本实现不了的!
  • 可以在以下几个地方做出精简
    • 扫描一次,然后记录所有相同长度,但是起点不同但是长度相同的字符串,然后在按照集合进行比较?这样确实能够缩减时间复杂度。
    • 尝试使用不同的字符串进行优化?最长公共字串有用吗?KMP算法?不得行!
  • 这样吧,匹配出每一个字符串在源字符串的位置,然后将源字符串标注为不同的序列,直接返回对应的序列即可。但是这里有一个问题的,就是这几个 word之间会出现嵌套的问题吗?如果出现嵌套问题就不好做了。
个人实现
  • 字符串s重点长度为x的s.size() - x个子串中,和words中的每一个字符串进行匹配,然后进行标注。判定当前的字符串是相等的,过滤一遍的。记录一下,每一个元素开始的位置,然后再向后进行遍历,保证结果相同?
  • 没有办法保证word和word之间是没有重叠的,这种情况肯定会出现,这就不知道怎么处理了。
  • 不想做了,今天好烦躁呀,还是直接看解说吧。
参考实现
  • 这里参考的y总的代码,基本思路还是很简答的,关键是如何将问题进行拆解,和我的思路比较像,但是有两个地方没有想到

    • 字符串的快速匹配可以使用hash实现,这里我并没有考虑到,在我的设想里面只能使用遍历实现
    • 两个字符字串的匹配使用两个hash表配合滑动窗口实现的
  • 具体思路分析图如下

具体实现代码如下

#include <iostream>
#include <unordered_map>
#include <vector>
using namespace std;vector<int> findSubstring(string s,vector<string >& words){vector<int> res;// 边界条件判定为空if (words.empty())  return res;// 定义words的长度和word的长度,以及整个string的长度int n = s.size(),m = words.size(),w = words[0].size();// 定义目标子串中的对应的hash表unordered_map<string,int> tot;for (auto s:words)  tot[s] ++;// 将待匹配的原始的字符串进行等距分割拼接for (int i = 0; i < w; ++i) {// 定义count记录当前起点下的有效的字符子串的个数int cnt = 0;// 对每一个起点创建对应的字典字符串unordered_map<string,int> temp;for (int j = i; j < n; j += w) {// 如果长度大于滑动窗口的长度,需要弹出if (j >= i + m * w){// 已经超过了长度,需要弹出最初的元素auto st = s.substr(j - m * w,w);temp[st] --;// 判定弹出的元素是否有效if (temp[st] < tot[st])    cnt--;}// 需要往队列中添加元素auto st = s.substr(j ,w);temp[st] ++;// 判定加入的元素是否有效if (temp[st] <= tot[st])    cnt ++;if (cnt == m)   res.push_back(j - (m - 1)*w );}}return res;
}int main(){}

总结

  • 刚到上海,总是有很多东西需要收拾,本来准备来实习的,结果的主管面还是把我拒了,确实没有准备好呀,难受,现在就是单纯来学习的了。心里怅然若失!不过无所谓了,先做着吧,尽力去做着吧。来了弄了蛮多家务的,昨天的都没有交稿,脱了两天,明天开始进入状态了,调整一下,不能浪费时间!继续卷吧!然后开始继续弄的!

  • 今天挫败感还是满足的,感觉坐立不安,怎么都不舒服。

    • 换环境了?
    • 没找到实习
  • 都有吧,好好干吧!

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

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

相关文章

百度Apollo的PublicRoadPlanner一些移植Ros2-foxy的思路(持续更新)

如今的PublicRoadPlanner就是之前耳熟能详的EM planner 计划 —— ROS2与CARLA联合仿真 结构化场景: 规划算法:EM-planner 控制算法:MPC和PID 非结构化场景: 规划算法采用Hybrid A* (1)小车模型搭建(计划参考Github上Hybrid上的黑车,比较炫酷) (2)车辆里程计: 位…

深入比较:Batch文件与Shell脚本的异同

在操作系统中&#xff0c;自动化脚本是一种常见的工具&#xff0c;用于执行一系列自动化命令或程序。Windows和类Unix系统都提供了各自的脚本解决方案&#xff1a;Batch文件&#xff08;在Windows中&#xff09;和Shell脚本&#xff08;在类Unix系统中&#xff09;。本文将详细…

有哪些方法可以恢复ios15不小心删除的照片?

ios15怎么恢复删除的照片&#xff1f;在手机相册里意外删除了重要的照片&#xff1f;别担心&#xff01;本文将为你介绍如何在iOS 15系统中恢复已删除的照片。无需专业知识&#xff0c;只需要按照以下步骤操作&#xff0c;你就能轻松找回宝贵的回忆。 一、从iCloud云端恢复删除…

SRC公益上分的小技巧一

前言 之前发布的文章&#xff0c;例如SRC中的一些信息收集姿势- Track 知识社区 - 掌控安全在线教育 - Powered by 掌控者 里面就有提到若依系统&#xff0c;默认账号密码非常简单 是 admin / admin123 但是&#xff0c;往往我们去挖掘的时候很容易出现 这说明了若依系统的门…

Viewer.js 图片预览插件使用

参考&#xff1a;Viewer.js 图片预览插件使用 demo链接&#xff1a;viewerjs_demo

【Linux:文件描述符】

文件描述符&#xff1a; 文件描述符的分配原则&#xff1a;最小未分配原则 每一个进程中有一个task_struct结构体&#xff08;PCB)&#xff0c;而task_struct中含有struct file_sturct*file的指针&#xff0c;该指针指向了一个struct files_struct的结构体该结构体中含有一个f…

PHP框架详解- symfony框架

Symfony框架是一个开源的PHP框架&#xff0c;由SensioLabs公司开发并维护&#xff0c;最早发布于2005年。它旨在为Web应用程序的开发提供一个高效且结构化的环境。Symfony框架的设计理念是减少Web应用程序的创建和维护时间&#xff0c;并避免重复性任务。 Symfony框架采用MVC&…

PG最大连接数

在 PostgreSQL 数据库中&#xff0c;您可以使用 SQL 查询来获取最大连接数、当前连接数以及每个数据库的连接数。以下是一些常用的查询&#xff1a; 查看最大连接数&#xff1a; PostgreSQL 的最大连接数由配置参数 max_connections 决定。您可以在 postgresql.conf 文件中设置…

使用IMAP服务获取163邮箱的未读邮件

使用IMAP服务获取163邮箱的未读邮件 整体的逻辑思路如下&#xff1a; 开启163邮箱的IMAP服务&#xff0c;拿到授权码用于登录IMAP服务登录IMAP服务&#xff0c;获取邮箱的未读邮件列表遍历未读邮件列表&#xff0c;获取邮件内容 # 导入必要的库 import os import imaplib im…

三大工作流引擎技术Activiti、Flowable、Camunda选型指南

文章目录 前言1 流程引擎发展历程2 流程引擎主要概念BPM (Business Process Management)BPMN (Business Process Model and Notation)CMMN (Case Management Model and Notation)DMN (Decision Model and Notation)事件&#xff08;Event&#xff09;顺序流&#xff08;Sequenc…

从静电到浪涌,全面防护:雷卯多电压等级电源保护设计方案汇总

在当今数字化、电气化日益加速的时代&#xff0c;电子设备和电力系统面临着前所未有的挑战&#xff0c;其中静电放电(ESD)、浪涌以及雷击等瞬态事件成为了威胁设备稳定性和寿命的关键因素。从精密的消费电子产品到工业级控制系统&#xff0c;从智能家居到新能源汽车&#xff0c…

区块链技术的核心要素:共识机制、加密技术与分布式账本

区块链听起来像个非常高大上的技术&#xff0c;其实它的核心原理并不难理解。今天我们要聊的就是区块链的三个核心要素&#xff1a;共识机制、加密技术和分布式账本。想象一下区块链是一个巨大的数字笔记本&#xff0c;我们要弄清楚大家如何共同写这个笔记本&#xff0c;又如何…

用一个实例看如何分享大量照片 续篇二,关于Exif (Exchangeable Image File) - 可交换图像文件

续篇二&#xff1a;说说关于照片隐含的 Exif (Exchangeable Image File) 可交换图像文件 数码照片的Exif 参数有很多&#xff0c;重要的Exif信息&#xff1a;拍摄日期、时间、拍摄器材、GPS信息。 当然这主要对自己的档案有意义&#xff0c;如果放到网上还是建议抹去这些信息。…

Bad owner or permissions on C:\\Users\\username/.ssh/config > 过程试图写入的管道不存在。

使用windows连接远程服务器出现Bad owner or permissions 错误 问题&#xff1a; 需要修复文件权限 SSH 配置文件应具有受限权限以防止未经授权的访问 确保只有用户对该.ssh/config文件具有读取权限 解决方案&#xff1a; 在windows下打开命令行&#xff0c;通过以下命令打开文…

C++编程(四)this指针 常函数 常对象 静态成员

文章目录 一、this指针&#xff08;一&#xff09;概念&#xff08;二&#xff09;显式使用this指针的场景1. 当形参和成员变量名一致时2. 返回对象自身的时候必须要使用this指针3. 在类中销毁一个对象 二、常函数和常对象&#xff08;一&#xff09;常函数1. 概念2. 语法格式 …

python OpenCV 库中的 cv2.Canny() 函数来对图像进行边缘检测,并显示检测到的边缘特征

import cv2# 加载图像 image cv2.imread(4.png)# 使用 Canny 边缘检测算法提取边缘特征 edges cv2.Canny(image, 100, 200)# 显示边缘特征 cv2.imshow(Edges, edges) cv2.waitKey(0) cv2.destroyAllWindows() 代码解析&#xff1a; 导入 OpenCV 库&#xff1a; import cv2加…

【MFC】socket通信代码解析

目录 一、在MFC中使用Winsock进行socket编程 1.1 包含必要的头文件 1.2 初始化Winsock 1.3创建socket 1.4 绑定socket 1.5 监听连接(对于服务器) 1.6 建立连接(对于客户端) 1.7 发送和接收数据 1.8. 关闭socket 1.9 错误处理 1.10 MFC集成 二、MFC中Socke…

PT100(RTD)是什么?2线,3线,4线原理

RTDs - or Resistance Temperature Detectors- (电阻式温度探测器)&#xff0c;是温度型传感器&#xff0c;包含一个电阻&#xff0c;这个阻值可以随温度的变化而变化。在工业的进程中和实验室里已经使用了很多年&#xff0c;以精确&#xff0c;可靠和稳定的特性。 2线制 2线制…

解决Ucharts在小程序上的层级过高问题

<qiun-wx-ucharts canvas2d"{{true}}" type"pie" opts"{{rectificationRateOpts}}" chartData"{{rectificationRateData}}" /> 开启2d渲染即可解决&#xff08;在小程序开发工具上看着层级还是高&#xff0c;但是在手机上是正常…

C语言| 数组元素的删除

同数组元素的插入差不多。 数组元素的插入&#xff0c;是先移动要插入元素位置后面的所有元素&#xff0c;再插入新元素&#xff0c;长度1。 C语言| 数组的插入-CSDN博客 数组元素的删除&#xff0c;是先删除元素&#xff0c;再把后面的元素往前移动一位&#xff0c;而本程序…