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

news2024/10/5 13:35:06

文章目录

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

引言

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

复习

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

以往的分析链接

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

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

个人实现
  • 这是第二次在做这道题,这是一个单纯的二维背包问题,需要理清楚最后是要你输出什么类型,先给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(){

}

总结

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

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

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

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

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

相关文章

SherlockChain:基于高级AI实现的智能合约安全分析框架

关于SherlockChain SherlockChain是一款功能强大的智能合约安全分析框架&#xff0c;该工具整合了Slither工具&#xff08;一款针对智能合约的安全工具&#xff09;的功能&#xff0c;并引入了高级人工智能模型&#xff0c;旨在辅助广大研究人员针对Solidity、Vyper和Plutus智…

CentOS安装ntp时间同步服务

CentOS安装ntp时间同步服务 安装ntp 检查服务器是否安装ntp&#xff1a; rpm -q ntp安装ntp&#xff1a; yum install -y ntp服务端配置 配置文件路径&#xff1a;/etc/ntp.conf 设置ntp为开机启动 systemctl enable ntpd查看ntp开机启动状态 enabled:开启, disabled:关闭 …

国际产业园双创孵化空间点亮创业梦想

国际数字影像产业园的双创孵化空间旨在打造一个集创意、技术、资金、市场等资源于一体的综合孵化平台&#xff0c;为初创企业和创新项目提供从创意到产品化、从初创到成长的全方位支持。 主要功能与服务 1、孵化服务&#xff1a;为初创企业提供办公场地、基础设施、技术支持等…

navicat Premium发布lite免费版本了

Navicat Premium发布lite免费版本了&#xff0c;下面是完整功能对比链接 Navicat Premium 功能列表 | Navicat 免费版本下载链接如下&#xff1a; Navicat | 免费下载 Navicat Premium Lite 开发功能完全够用&#xff0c;点赞。 dbeaver该如何应对。

幻兽帕鲁Palworld樱花版本服务器一键开服联机

1、登录服务器&#xff08;百度莱卡云&#xff09; 1.1、第一次购买服务器会安装游戏端&#xff0c;大约5分钟左右&#xff0c;如果长时间处于安装状态请联系客服 2、在启动中调整游戏参数 2.1、重启服务器&#xff0c;等待running出现&#xff0c;或者运行时间变为灰色&#x…

MySQL高级-索引-使用规则-前缀索引

文章目录 1、前缀索引2、前缀长度3、查询表数据4、查询表的记录总数5、计算并返回具有电子邮件地址&#xff08;email&#xff09;的用户的数量6、从tb_user表中计算并返回具有不同电子邮件地址的用户的数量7、计算唯一电子邮件地址&#xff08;email&#xff09;的比例相对于表…

为什么要本地化您的多媒体内容?

当我们访问网站、应用程序和社交媒体时&#xff0c;体验不再局限于陈旧的文本和静态图像。现代处理能力和连接速度提高了快速加载视频、音频和动画的可能性。 这一切都提供了更具沉浸感和互动性的用户体验。多媒体是数字营销中最有效的内容之一&#xff0c;因为它对用户更具吸…

优思学院|工厂的部门架构管理与精益生产

工厂内有不同部门&#xff0c;各部门之间必须协调合作才能发挥整体功能。工厂最主要的部分是制造产品的现场&#xff0c;这里安装了生产工具&#xff0c;还有操作员进行加工或生产制造。 制造时使用的材料或零组件&#xff0c;需要对外采购。对于加工组装型的工厂&#xff0c;…

单片机+DS18B20温度控制程序仿真与原理图PCB文件 可设上下限

资料下载地址&#xff1a;单片机DS18B20温度控制程序仿真与原理图PCB文件 可设上下限 目录 1、项目介绍 2、实物图 ​3、电路原理图 ​4、仿真原理图 ​5、部分代码 1、项目介绍 基于51单片机温度控制&#xff0c;使用18b20来做温度传感器&#xff0c;四位共阳数码管显…

python中类的继承详解

面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力&#xff1a;它可以使用现有类的所有功能&#xff0c;并在无需重新编写原来的类的情况下对这些功能进行扩展 &#xff08;1&#xff09;在类的继承中&#xff0c;存在父类跟子类&#xff0c;子类可以继…

【pytorch09】数学运算

1.数学操作 add/minus/multiply/dividematmulpowsqrt/rsqrtround 2.加减乘除 加法 矩阵乘法 torch.mm 只适用于2d torch.matmul 要分清楚是矩阵元素相乘&#xff0c;还是矩阵相乘 例子 x一共有4张照片&#xff0c;每张照片打平成784的向量&#xff0c;希望降维得到[4,51…

如何在线上快速定位bug(干货)

想必有许多人都想我刚进公司一样不会快速定位线上bug吧&#xff0c;不会快速定位bug会大大降低我们的开发效率&#xff0c;随之而来的就是工作质量下降、业绩下滑。 我总结了一些我常用的线上定位技巧&#xff0c;希望能帮助到大家&#xff01; 我这里以使用阿里云日志分析作…

什么是有效的电子签名?PDF电子签名怎样具备法律效力?

电子签名逐渐成为商务文书和法律文件中不可或缺的一部分。《电子签名法》自2005年4月1日起施行&#xff0c;这一立法是中国信息化法律的重要里程碑&#xff0c;为电子签名应用奠定了法律基础。电子签名不仅仅是一种技术手段&#xff0c;更是一种法律认可的签名形式。那么究竟什…

聚类模型的算法性能评价

一、概述 作为机器学习领域的重要内容之一&#xff0c;聚类模型在许多方面能够发挥举足轻重的作用。所谓聚类&#xff0c;就是通过一定的技术方法将一堆数据样本依照其特性划分为不同的簇类&#xff0c;使得同一个簇内的样本有着更相近的属性。依不同的实现策略&#xff0c;聚类…

章十九、JavaVUE —— 框架、指令、声明周期、Vue-cli、组件路由、Element

目录 一、 框架 ● vue.js 框架 ● 特点 ● Vue 安装 二、 第一个vue程序 ● 创建项目 ​编辑 ● 导入 vue.js ● 创建vue对象&#xff0c;设置属性&#xff0c;使用模版渲染到页面 介绍 — Vue.js (vuejs.org) 三、 vue指令 ● v-text ● v-html ● v-…

pytest测试框架pytest-order插件自定义用例执行顺序

pytest提供了丰富的插件来扩展其功能&#xff0c;本章介绍插件pytest-order&#xff0c;用于自定义pytest测试用例的执行顺序。pytest-order是插件pytest-ordering的一个分支&#xff0c;但是pytest-ordering已经不再维护了&#xff0c;建议大家直接使用pytest-order。 官方文…

MySQL周内训参照4、触发器-插入-修改-删除

触发器 1、用户购买商品时&#xff0c;要求库存表中的库存数量自动修改 详细示例 delimiter $$ create trigger stock_change after -- 事件触发在 下订单之后 insert -- 监视插入事件 on stock -- 监视 order订单表 for each row begin update stock set stockstock-new.st…

【LeetCode】七、树、堆、图

文章目录 1、树结构2、二叉树3、二叉树的遍历4、堆结构&#xff08;Heap&#xff09;5、堆化6、图 1、树结构 节点、根节点、叶子节点&#xff1a; 高度、深度、层三者的示意图&#xff1a; 2、二叉树 相比其他树&#xff0c;二叉树即每个节点最多两个孩子&#xff08;两个分…

Java集合实例

一、什么是Java集合实例&#xff1a; 指的是在 Java 程序中创建和使用的集合对象&#xff0c;这些对象用于存储和操作数据。Java 集合框架提供了一系列的接口和实现类&#xff0c;用于管理不同类型的数据集合。 二、Java集合的主要实例类型&#xff1a; 1. List&#xff08;列…

音视频入门基础:H.264专题(8)——H.264官方文档的描述符

音视频入门基础&#xff1a;H.264专题系列文章&#xff1a; 音视频入门基础&#xff1a;H.264专题&#xff08;1&#xff09;——H.264官方文档下载 音视频入门基础&#xff1a;H.264专题&#xff08;2&#xff09;——使用FFmpeg命令生成H.264裸流文件 音视频入门基础&…