秋招突击——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);
                else
                    f[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(){

}

总结

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java程序员接单的十条“野路子”,分分钟收入20K!

Java程序员除了主业工作外&#xff0c;也要适当扩展兼职接单这条路。毕竟Java接单可以说是Java程序员进行技术变现的最佳方式之一。 因为Java程序员兼职接单的难度相对更低&#xff0c;单量也比较可观&#xff0c;最重要的是性价比也很顶&#xff0c;且听我一一道来&#xff1a…

Linux0.12内核源码解读(5)-head.s

大家好&#xff0c;我是呼噜噜&#xff0c;好久没有更新old linux了&#xff0c;本文接着上一篇文章图解CPU的实模式与保护模式&#xff0c;继续向着操作系统内核的世界前进&#xff0c;一起来看看heads.s as86 与GNU as 首先我们得了解一个事实&#xff0c;在Linux0.12内核源…

20240628 每日AI必读资讯

&#x1f4da; Hugging Face 推出新版开源大模型排行榜&#xff0c;中国模型 Qwen-72B 夺冠 - 阿里Qwen-2-72B指令微调版本问鼎全球开源大模型排行榜榜首 - Llama-3-70B 微调版本排名第二&#xff0c;而 Mixtral-8x22B 微调版本位居第四。 - 另外&#xff0c;微软的 Phi-3-M…

卸载vmware时2503,2502报错的解决办法

1.背景 windows 卸载vmware时&#xff0c;显示2503报错&#xff0c;无法完全卸载 2. 解决方案 2.1 参考安装报错2502&#xff0c;2503的处理方式 文献&#xff1a;https://blog.csdn.net/zhangvalue/article/details/80309828 2.1 步骤&#xff1a; 2.1.1 cmd 管理员打开…

字节码编程ASM之插桩方法执行耗时

写在前面 本文看下如何对已有类进行插装。以最经典的方法执行耗时作为例子。 1&#xff1a;编码 假定有如下的代码&#xff1a; public class MyMethod {public String queryUserInfo(String uid) {System.out.println("xxxx");System.out.println("xxxx1&q…

可的哥Codigger项目体检是衡量代码质量标准

在飞速发展的现代商业世界中&#xff0c;项目能否成功的核心要素是项目质量&#xff0c;也就是其健康状态。为了确保项目顺利进行并达到预期目标&#xff0c;项目体检工具&#xff08;Health Check&#xff09;&#xff0c;简称“项目体检”&#xff0c;变得尤为重要。可的哥&a…

一分钟学习数据安全—自主管理身份SSI分布式标识DID介绍

SSI标准化的两大支柱&#xff0c;一个是VC&#xff0c;之前简单介绍过&#xff0c;另一个就是DID。基本层次上&#xff0c;DID就是一种新型的全局唯一标识符&#xff0c;跟浏览器的URL没有什么不同。深层次上&#xff0c;DID是互联网分布式数字身份和PKI新层级的原子构件。 一…

猫咪主食冻干哪个牌子好?希喂、SC、鲜朗人气养猫好物强烈推荐

目前主食冻干市场产品良莠不齐&#xff0c;一些主食冻干品牌一味追求堆砌营养值和利润&#xff0c;实际毫不关心猫咪食品健康&#xff0c;不仅存在肉粉冒充鲜肉、临期改日期卖等问题&#xff0c;甚至出现并为送检第三方、细菌超标等情况&#xff0c;严重的甚至危及猫咪生命&…

从单点到全景:视频汇聚/安防监控EasyCVR全景视频监控技术的演进之路

在当今日新月异的科技浪潮中&#xff0c;安防监控领域的技术发展日新月异&#xff0c;全景摄像机便是这一领域的杰出代表。它以其独特的360度无死角监控能力&#xff0c;为各行各业提供了前所未有的安全保障&#xff0c;成为现代安防体系中的重要组成部分。 一、全景摄像机的技…

ISO 50001能源管理体系:激活绿色动能和共塑可持续发展

在当今全球化加速和工业化水平不断提高的背景下&#xff0c;能源消费呈现出前所未有的增长趋势。然而&#xff0c;能源资源的有限性、能源价格的波动以及能源消费对环境造成的影响&#xff0c;尤其是温室气体排放导致的全球气候变化问题&#xff0c;已经成为全球关注的焦点。为…

2024 6.17~6.23 周报

一、上周工作 吴恩达的机器学习、实验-回顾之前密集连接部分 二、本周计划 继续机器学习&#xff0c;同时思考实验如何修改&#xff0c;开始整理代码 三、完成情况 3.1 多类特征、多元线性回归的梯度下降、特征缩放、逻辑回归 多类特征&#xff1a; 多元线性回归的梯度下…

远程工具的使用

远程连接工具的作用&#xff0c;通过远程连接到服务器上&#xff0c;方便操作&#xff01; 1.常见的远程连接工具 XShell&#xff1a;这是一款Windows平台下的SSH客户端软件&#xff0c;支持SSH1、SSH2、SFTP、TELNET、RLOGIN等多种协议&#xff0c;功能丰富&#xff0c;包…

frida的安装使用以及解决抓包app时遇到的证书校验

frida的安装和使用 这里使用夜神模拟器来演示frida的使用&#xff0c;因为真机开启frida-server服务时需要root权限,模拟器自带root 下载夜神模拟器并启动 夜神官网 打开power shell&#xff0c; adb连接模拟器&#xff0c;查看模拟器的系统型号 adb connect 127.0.0.1:6200…

解锁高效运维新纪元:网络基础设施数字孪生管理工具

随着信息技术的飞速发展&#xff0c;网络基础设施的运维管理变得日益复杂。北京耐威迪科技股份有限公司凭借其创新技术&#xff0c;推出了nVisual网络基础设施数字孪生管理工具&#xff0c;这一革命性的解决方案不仅提升了运维效率&#xff0c;更在成本节约和项目进度上实现了突…

【Redis】Set 集合常用命令以及使用场景

集合&#xff08;Set&#xff09;类型的值是字符串的无序集合&#xff0c;并且每个值都是唯一的。本文将介绍 Redis Set 的常用命令包含示例、Set的内部编码以及使用场景。 集合类型也是保存多个字符串类型的元素的&#xff0c;但和列表类型不同的是&#xff0c;集合中 1)元素…

2024最新总结:1500页金三银四面试宝典 记录35轮大厂面试(都是面试重点)

学习是你这个职业一辈子的事 手里有个 1 2 3&#xff0c;不要想着去怼别人的 4 5 6&#xff0c;因为还有你不知道的 7 8 9。保持空瓶心态从 0 开始才能学到 10 全。 毕竟也是跳槽高峰期&#xff0c;我还是为大家准备了这份1500页金三银四宝典&#xff0c;记录的都是真实大厂面…

VS2019安装插件image watch

image watch的作用&#xff1a; &#xff08;1&#xff09;放大、缩小图像&#xff1b; &#xff08;2&#xff09;将图像保存到指定的目录&#xff1b; &#xff08;3&#xff09;显示图像大小、通道数&#xff1b; &#xff08;4&#xff09;拖拽图像&#xff1b; &…

jenkins nginx自动化部署 php项目

在当今快速发展的IT领域&#xff0c;自动化部署已成为提高工作效率和减少错误的关键。Jenkins作为持续集成/持续部署&#xff08;CI/CD&#xff09;的佼佼者&#xff0c;结合Docker容器技术和PHP编程语言&#xff0c;以及Ansible自动化工具&#xff0c;可以实现高效、可靠的自动…

AppFlow无代码轻松搭建模型Agent

随着大语言模型发展至今&#xff0c;如何深度开发和使用模型也有了各种各样的答案&#xff0c;在这些答案当中&#xff0c;Agent无疑是一个热点回答。 通过模型也各种插件的组合&#xff0c;可以让你的模型应用具备各种能力&#xff0c;例如&#xff0c;通过天气查询插件机票查…

使用 SwiftUI 为 macOS 创建类似于 App Store Connect 的选择器

文章目录 前言创建选择器组件使用选择器组件总结前言 最近,我一直在为我的应用开发一个全新的界面,它可以让你查看 TestFlight 上所有可用的构建,并允许你将它们添加到测试群组中。 作为这项工作的一部分,我需要创建一个组件,允许用户从特定构建中添加和删除测试群组。我…