2.14数据结构与算法学习日记

洛谷P1934 封印

题目背景

很久以前,魔界大旱,水井全部干涸,温度也越来越高。为了拯救居民,夜叉族国王龙溟希望能打破神魔之井,进入人界“窃取”水灵珠,以修复大地水脉。可是六界之间皆有封印,神魔之井的封印由蜀山控制,并施有封印。龙溟作为魔界王族,习有穿行之术,可任意穿行至任何留有空隙的位置。然而封印不留有任何空隙! 龙溟无奈之下只能强行破除封印。破除封印必然消耗一定的元气。为了寻找水灵珠,龙溟必须减少体力消耗。他可以在破除封印的同时使用越行术。

题目描述

神魔之井的封印共有 �n 层,每层封印都有一个坚固值。身为魔族的龙溟单独打破一层封印时需要消耗的元气为该层封印的坚固值和封印总层数 �n 的平方的乘积; 但他也可以打破第 i 层到第 j 层之间的所有封印( �<�i<j),总元气消耗为第 �,�i,j 层封印的坚固值之和与第 �,�i,j 层之间所有封印层(包括第 �,�i,j 层)的坚固值之和的乘积,但为了不惊动蜀山,第 �,�i,j 层封印的坚固值之和不能大于 t (单独打破可以不遵守)。

输入格式

第一行包含两个正整数 n 和 t。
第二行有 n 个正整数,第 i 个数为 ai​,表示第 i 层封印的坚固值。

输出格式

仅一行,包含一个正整数,表示最小消耗元气。

输入输出样例

输入 #1复制

6 10
8 5 7 9 3 5

输出 #1复制

578

说明/提示

样例解释

先单独打破第一层,再用越行术从第二层直接打破到最后一层。 这样消耗元气 8×62+(5+5)×(5+7+9+3+5)=578

数据范围

对于 10%10% 的数据, n≤10;
对于 50%50% 的数据, n≤100;
对于 70%70% 的数据, n≤500;
对于 100%100% 的数据, n≤1000,ai​(1≤i≤n),t≤20000。

题目分析

1,据题意所以这题里面选择用dp来动态规划

2,创建一个dp数组dp[j]用来存放i层到截止到j层消耗的元气

3,由题目 "单独打破一层封印时需要消耗的元气为该层封印的坚固值和封印总层数 n 的平方的乘积".

"打破第 i 层到第 j 层封印(i<j)的总元气消耗为第 i, j 层封印的坚固值之和与第 i, j 层之间所有封印层(包括第 i, j 层)的坚固值之和的乘积。同时,为了不惊动蜀山,第 i, j 层封印的坚固值之和必须不大于一个固定值 t" 。

4,由此得出

1.  dp[j]=min(dp[j],dp[j-1]+a[j]*n*n);

 2.if(a[j]+a[i]<=t) dp[j]=min(dp[j],dp[i-1]+(a[j]+a[i])*(f[j]-f[i-1]));

代码示例

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,t;
ll a[1006];
ll s[1006];
ll dp[1006];
int main(){
     cin>>n>>t;
     for(int j=1;j<=n;j++)
     {
         cin>>a[j];
         s[j]=s[j-1]+a[j];//前缀和
         dp[j]=LONG_LONG_MAX;//因为找小值所以初始值大点
     }
     for(int j=1;j<=n;j++)
      {dp[j]=min(dp[j],dp[j-1]+a[j]*n*n);//单独打破一层
         for(int i=1;i<j;i++)
           if(a[j]+a[i]<=t)//第 i, j 层封印的坚固值之和必须不大于一个固定值 t
            dp[j]=min(dp[j],dp[i-1]+(a[j]+a[i])*(s[j]-s[i-1]));//i到j层的法力比较

      }
        cout<<dp[n];






}

洛谷P3375 【模板】KMP

题目描述

给出两个字符串 s1​ 和 s2​,若 s1​ 的区间 [l,r] 子串与 s2​ 完全相同,则称 s2​ 在 s1​ 中出现了,其出现位置为 l。
现在请你求出 s2​ 在 s1​ 中所有出现的位置。

定义一个字符串 s 的 border 为 s 的一个非 s 本身的子串 t,满足 t 既是 s 的前缀,又是 s 的后缀。
对于 s2​,你还需要求出对于其每个前缀 ′s′ 的最长 border ′t′ 的长度。

输入格式

第一行为一个字符串,即为 s1​。
第二行为一个字符串,即为 s2​。

输出格式

首先输出若干行,每行一个整数,按从小到大的顺序输出 s2​ 在 s1​ 中出现的位置。
最后一行输出 ∣s2​∣ 个整数,第 i 个整数表示 s2​ 的长度为 i 的前缀的最长 border 长度。

输入输出样例

输入 #1复制

ABABABC
ABA

输出 #1复制

1
3
0 0 1 

说明/提示

样例 1 解释

对于 s2​ 长度为 3的前缀 ABA,字符串 A 既是其后缀也是其前缀,且是最长的,因此最长 border 长度为 1。

数据规模与约定

本题采用多测试点捆绑测试,共有 3 个子任务

  • Subtask 1(30 points):s1​∣≤15,s2​∣≤5。
  • Subtask 2(40 points):2∣≤102∣s2​∣≤102。
  • Subtask 3(30 points):无特殊约定。

对于全部的测试点,保证 1≤∣s1​∣,∣s2​∣≤106,s1​,s2​ 中均只含大写英文字母。

题目分析

1,这题属于一个经典的kmp模板题

2,

KMP算法是一种用于字符串匹配的经典算法,它的基本思想是利用已经匹配过的部分信息来减少不必要的比较次数,从而提高匹配的效率。

KMP算法的核心是构建一个部分匹配表(也称为next数组),这个表记录了在匹配过程中出现不匹配时,可以跳过已经匹配过的部分,从而减少比较次数。通过这个部分匹配表,KMP算法可以在不回溯的情况下,快速地找到匹配失败时需要移动的位置。

具体来说,KMP算法在匹配过程中,当发现不匹配时,会根据部分匹配表中的信息,将模式串向后移动一定的位置,而不是从头开始重新比较。这样就能够减少比较次数,提高匹配效率。

3,这算法主要的实现是next数组的创建

KMP算法中的next数组是用来存储模式串中每个位置的最长公共前缀和最长公共后缀的长度的数组。这个数组在KMP算法中用于在匹配过程中进行跳转,以避免不必要的比较。 具体来说,对于模式串P,next[i]表示P[0:i]这个子串的最长公共前缀和最长公共后缀的长度(不包括P[i]本身)。在KMP算法中,当P[i]和T[j]不匹配时(T为文本串),根据next数组的值可以快速地移动模式串,跳过已经匹配过的部分,从而提高匹配的效率。

假设我们有一个文本串 "ABC ABCDAB ABCDABCDABDE" 和一个模式串 "ABCDABD"。

首先,我们需要构建模式串 "ABCDABD" 的 next 数组。这个过程可以通过遍历模式串来完成,具体过程如下:

  1. 首先,next[0] 总是 -1。
  2. 然后,我们从第二个字符开始,依次计算每个位置的最长相同前缀后缀的长度。
    • next[1] = 0,因为第一个字符没有前缀和后缀。
    • next[2] = 0,因为 "AB" 的前缀和后缀没有重叠。
    • next[3] = 0,因为 "ABC" 的前缀和后缀没有重叠。
    • next[4] = 0,因为 "ABCD" 的前缀和后缀没有重叠。
    • next[5] = 1,因为 "ABCDA" 的前缀 "A" 和后缀 "A" 相同,长度为 1。
    • next[6] = 2,因为 "ABCDAB" 的前缀 "AB" 和后缀 "AB" 相同,长度为 2。
    • next[7] = 0,因为 "ABCDABD" 的前缀和后缀没有重叠。

因此,模式串 "ABCDABD" 的 next 数组为 [-1, 0, 0, 0, 0, 1, 2]。

接下来,我们使用KMP算法来在文本串中查找模式串。具体过程如下:

  1. 我们将模式串 "ABCDABD" 和文本串 "ABC ABCDAB ABCDABCDABDE" 对齐,从头开始逐个字符进行比较。
  2. 当模式串和文本串中的字符匹配时,继续比较下一个字符。
  3. 当模式串和文本串中的字符不匹配时,根据 next 数组的值来移动模式串,而不是每次只移动一位。

 代码示例

#include<bits/stdc++.h>
using namespace std;
#define MAXnext 1000010
long long next1[MAXnext];
long long ls,ls1;
char s[MAXnext];
char s1[MAXnext];
void getnext(char a[])//创建next数组统计最长公共前缀长度
{
    long long j=0;
    for(long long i=1; i<ls1; i++)
    {
        while(a[i]!=a[j]&&j>0)
        {
            j=next1[j-1];
        }
        if(a[i]==a[j])j++;
        next1[i]=j;
    }
}
int main()
{
    scanf("%s",s);
    scanf("%s",s1);
    ls=strlen(s);
    ls1=strlen(s1);
    getnext(s1);
    long long j=0;
    for(long long i=0; i<ls; i++)
    {
        while(j>0&&s[i]!=s1[j])j=next1[j-1];//不相等就回到对应next数组前一位的位置
        if(s[i]==s1[j])j++;//相等就接着比较
        if(j==ls1)
           { printf("%lld\n",i-ls1+2);

           }
    }

    for(int i=0; i<ls1; i++)
  printf("%lld ",next1[i]);


}

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

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

相关文章

Leetcode 236.二叉树的最近公共祖先

题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节点也可以是它自己的…

遇到太多的Windows问题怎么办?这里提供几个修复工具

“部署映像服务和管理”工具(DISM)是一个有用且高级的工具,用于扫描、更改和修复任何Windows系统问题。许多操作系统问题,如性能差、启动问题或特定崩溃,都可以归结为损坏的系统文件,而此命令工具能够解决这些问题。 如何检查文件系统 在运行DISM修复之前,重要的是运行…

2024.2.7

1、二叉树的操作 #include<stdio.h> #include<string.h> #include<stdlib.h> typedef char datatype; typedef struct Node {//数据域datatype data;//左孩子指针struct Node *lchild;//右孩子指针struct Node *rchild; }*Btree; Btree create_node() {Btre…

【碎片知识点】安装Linux系统 VMware与kali

天命&#xff1a;VMware就是可以运行操作系统的载体&#xff0c;kali就是Linux的其中一个分支 天命&#xff1a;Linux有两个分支版本&#xff1a;centos与ubuntu&#xff0c;kali底层就是ubuntu&#xff08;所有Linux用起来都差不多&#xff0c;没啥区别&#xff09; 天命&…

Ubuntu 23.10通过APT安装Open vSwitch

正文共&#xff1a;888 字 8 图&#xff0c;预估阅读时间&#xff1a;1 分钟 先拜年&#xff01;祝各位龙年行大运&#xff0c;腾跃展宏图&#xff01; 之前在介绍OpenStack的时候介绍过&#xff08;什么是OpenStack&#xff1f;&#xff09;&#xff0c;OpenStack是一个开源的…

MATLAB知识点:factorial函数(★★★☆☆)计算阶乘

​讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 节选自第3章&#xff1a;课后习题讲解中拓展的函数 在讲解第…

《小强升职记:时间管理故事书》阅读笔记

目录 前言 一、你的时间都去哪儿了 1.1 你真的很忙吗 1.2 如何记录和分析时间日志 1.3 如何找到自己的价值观 二、无压工作法 2.1 传说中的“四象限法则 2.2 衣柜整理法 三、行动时遇到问题怎么办&#xff1f; 3.1 臣服与拖延 3.2 如何做到要事第一&#xff1f; 3.…

第二十九回 施恩三入死囚牢 武松大闹飞云浦-分布式版本控制系统Git使用

武松要蒋门神答应三件事&#xff1a;离开快活林、东西都归还施恩&#xff0c;公开对施恩赔礼道歉&#xff0c;不许在孟州住。蒋门神不得已都答应了&#xff0c;灰溜溜地离开了孟州城。 一个月之后&#xff0c;天气转凉&#xff0c;张都监调武松到孟州城&#xff0c;做了他的亲…

耳机壳UV树脂制作私模定制耳塞需要哪些工具和材料呢?

制作私模定制耳塞需要使用到一些工具和材料&#xff0c;包括但不限于以下内容&#xff1a; UV树脂&#xff1a;用于制作耳塞的主体部分&#xff0c;具有高硬度、耐磨、耐高温、环保等优点。耳模材料&#xff1a;用于获取用户的耳型&#xff0c;通常是一些快速固化的材料&#…

Kafka(三)(集成SpringBoot)

第三章 Kafka集成 SpringBoot SpringBoot 是一个在 JavaEE 开发中非常常用的组件。可以用于 Kafka 的生产者&#xff0c;也可以 用于 SpringBoot 的消费者。 在初始化springboot环境的时候要勾选kafka依赖 <dependency><groupId>org.springframework.kafka</gr…

代码随想录刷题笔记 DAY 25 | 组合问题 No.77 | 组合求和III No.216 | 电话号码的字母组合 No.17

文章目录 Day 2501. 组合问题&#xff08;No. 77&#xff09;2.1 题目2.2 笔记2.3 代码 02. 组合求和III&#xff08;No. 216&#xff09;2.1 题目2.2 笔记2.3 代码 03. 电话号码的字母组合&#xff08;No. 17&#xff09;3.1 题目3.2 笔记3.3 代码3.4 补充 Day 25 01. 组合问…

uniapp前端手机获取安全区域css值 防止按键不能被点击

引入 再编写小程序和移动端的时候可能会出现这种情况&#xff0c;页面中的按键刚好才手机中按不到的位置 如下 这是苹果手机的home按键 如果刚好我们的按钮再这个位置,用户是点击不到的 我们就需要一个办法,能够自动的让我们的按键移动到安全可点击的区域 解决 我们可以使用…

【开源图床】使用Typora+PicGo+Gitee搭建个人博客图床

准备工作&#xff1a; 首先电脑得提前完成安装如下&#xff1a; 1. nodejs环境(node ,npm):【安装指南】nodejs下载、安装与配置详细教程 2. Picgo:【安装指南】图床神器之Picgo下载、安装与配置详细教程 3. Typora:【安装指南】markdown神器之Typora下载、安装与无限使用详细教…

nvm 安装nodejs教程【详细】

目录 一、安装nvm 二、配置镜像 三、安装nodejs 安装 查看正在用的nodejs版本 切换版本 一、安装nvm 双击安装包&#xff1a; 无脑下一步即可&#xff0c;当然你可以自定义你自己的安装目录。 安装完后&#xff0c;打开环境变量&#xff0c;你会发现nvm为我们自动配置好…

vue对于安装依赖时不好习惯的反省

因为一个不好的习惯&#xff0c;我总是喜欢–save去安装依赖包&#xff0c;然后发现最后打包后的内容总是很大。就想着怎么能让包小一些&#xff0c;就发现我遗漏了vue安装依赖的一个小知识点 安装依赖的时候可以-s -d -g去安装&#xff0c;要根据使用的内容选择去安装&#xf…

MYSQL学习笔记:MYSQL存储引擎

MYSQL学习笔记&#xff1a;MYSQL存储引擎 MYSQL是插件式的存储引擎 存储引擎影响数据的存储方式 存储引擎是用来干什么的&#xff0c;innodb和myisam的主要区别–数据存储方式----索引 mysql> show engines; ----------------------------------------------------------…

Linux_动静态库

动态库 静态库 刚开始学编程时&#xff0c;需要下载一个环境&#xff08;vs2019&#xff09;&#xff0c;这个环境包括编译器和标准库&#xff0c;标准头文件。那么什么是库呢&#xff0c;库和头文件有什么关系呢&#xff1f; 头文件里面放的函数声明&#xff0c;库文件里面放…

python面向对象三大特性详解 - 封装 继承 多态

前言 面向对象编程有三大特性&#xff1a;封装、继承、多态&#xff0c;本文带大家来认识和了解这三个特性~ 补充 - 新式类 & 经典类 在python2.x中&#xff0c;新式类是继承了object类的子类&#xff0c;以及该子类的子类 子子类...&#xff1b;经典类就是没有继承没有…

新项目,从0到1,SpringBoot+Vue.js权限管理系统,拿去做毕设

大家好&#xff0c;我是 jonssonyan 最近把以前做的权限管理系统重新整理了一下&#xff08;将一些不规范的地方规范了一下&#xff0c;并且在关键地方写了注释&#xff09;&#xff0c;代码全部开源&#xff0c;这个项目是以现在主流的前后端分离模式开发的&#xff0c;包含前…

二叉树基础总结

目录 树的定义&#xff1a; 深度和高度&#xff1a; 二叉树 由来 二叉树种类&#xff1a; 满二叉树&#xff1a; 完全二叉树&#xff1a; 严格二叉树&#xff08;Strict Binary Tree&#xff09;&#xff1a; 平衡二叉树&#xff08;Balanced Binary Tree&#xff09;&…