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

news2024/11/28 2:51: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]);


}

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

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

相关文章

洛谷_P1059 [NOIP2006 普及组] 明明的随机数_python写法

这道题的关键在于去重和排序&#xff0c;去重可以联想到集合&#xff0c;那排序直接使用sort方法。 n int(input()) data set(map(int,input().split( ))) data list(data) data.sort() print(len(data)) for i in data:print(i,end )

Python编程之旅:从入门到精通

在数字世界的无尽宇宙中&#xff0c;Python无疑是一颗璀璨的明星。其简洁易懂的语法、丰富的库和广泛的应用领域&#xff0c;使得Python成为了众多初学者的首选编程语言。那么&#xff0c;如何学习Python呢&#xff1f;本文将带你一步步踏上Python编程的旅程。 一、入门篇&…

1.Electron初始与安装

这里写目录标题 一、前言二、下载三、简要总结 一、前言 原文以及该系列后续文章请参考&#xff1a;安装Electron 随着前端的不断强盛&#xff0c;现在的前端已经不再满足于网页开发了&#xff0c;而是在尝试能否使用前端的开发逻辑来开发PC端的桌面软件。 即用html、js、css…

软件价值12-射箭游戏

射箭游戏&#xff0c;按空格键发射&#xff0c;打击移动靶&#xff0c;左上角显示成绩状态。 代码&#xff1a; import pygame import sys import random# 初始化Pygame pygame.init()# 设置窗口大小 SCREEN_WIDTH 800 SCREEN_HEIGHT 600 screen pygame.display.set_mode((…

leetcode:55.跳跃游戏

1.解题思路&#xff1a;贪心算法看最大覆盖范围 2.模拟过程&#xff1a; 1.若数组长度等于1&#xff0c;直接返回True 2.循环遍历覆盖范围&#xff0c;选取最大的覆盖范围&#xff1b;若覆盖范围覆盖到了最后一个元素&#xff0c;直接返回true. 3.代码&#xff1a;(贪心无套…

蓝牙BLE学习-蓝牙广播

1.概念 什么叫做广播&#xff0c;顾名思义就像广场上的大喇叭一样&#xff0c;不停的向外传输着信号。不同的是&#xff0c;大喇叭传输的是音频信号&#xff0c;而蓝牙传输的是射频信号。 BLE使用的是无线电波传递信息&#xff0c;就是将数据编码&#xff0c;调制到射频信号中发…

Node.js开发-HTTP协议

HTTP协议 1) 概念2) 请求报文的组成3) HTTP 的请求行4) HTTP 请求头5) HTTP 的请求体6) 响应报文的组成7) 创建 HTTP 服务8) 获取 HTTP请求报文9) 设置 HTTP 响应报文10) 设置资源类型&#xff08;mime类型&#xff09;11) GET和POST请求的区别 1) 概念 HTTP&#xff08;hyper…

php数组与字符串函数

php数组与字符串函数 1. php数组2. 字符串函数 1. php数组 在php中&#xff0c;有三种类型的数组&#xff1a; 数值数组 - 带有数字ID键的数组关联数组 - 带有指定的键的数组&#xff0c;每个键关联一个值多维数组 - 包含一个或多个数组的数组 2. 字符串函数 在PHP中&#xf…

LeetCode:70.爬楼梯

前言&#xff1a;好家伙&#xff0c;一直以为动态规划是啥高大上的&#xff0c;解释那么多&#xff0c;在我看来不过是找规律罢了&#xff0c; 写那么多"专业术语"咋看咋像糊弄人的 (手动扶额) 另外&#xff0c;通项公式虽然抽象还能接受&#xff0c;但是矩阵快速幂…

Spring Boot 笔记 008 创建接口_获取用户信息

1.1.1 编写userinfo接口 1.1.2 User实体类中增加转json忽略password注释 package com.geji.pojo;import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; import lombok.Data;import java.time.LocalDateTime;//lombok 在…

给定n个结点的树,其中有k个结点是特殊结点(未知),定义好结点:该结点到k个特殊结点的距离之和最小。若随机k个结点为特殊结点,求好结点个数的期望值

题目 思路: 举例: 其中黑色结点为特殊结点,可以看出,每种情况都有一个结点的s值不等于k / 2,但是是好结点,所以最后答案加一。 #include <bits/stdc++.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second …

Linux释放内存

free -m是Linux上查看内存的指令&#xff0c;其中-m是以兆&#xff08;MB&#xff09;为单位&#xff0c;如果不加则以KB为单位。 如下图表示&#xff0c;&#xff08;total&#xff09;总物理内存是809MB&#xff0c;&#xff08;used&#xff09;已使用167MB&#xff0c;&…

【深度学习】: 脑部MRI图像分割

清华大学驭风计划课程链接 学堂在线 - 精品在线课程学习平台 (xuetangx.com) 代码和报告均为本人自己实现&#xff08;实验满分&#xff09;&#xff0c;只展示主要任务实验结果&#xff0c;如果需要详细的实验报告或者代码可以私聊博主&#xff0c;接实验技术指导1对1 有任…

不可错过!10款超赞实用插件框架

Cocos 游戏开发十八般武器&#xff0c;尽在 Cocos Store 今天给大家分享10款实用插件与框架&#xff01; 1. 快闪-Tab标签王(prefab标签栏) 作者&#xff1a;嘉年华&#xff08;gameWs&#xff09; 《快闪-标签王》插件&#xff0c;解决了日常开发过程中&#xff0c;经常需要通…

一起玩儿Proteus仿真(C51)——05. 红绿灯仿真(一)

摘要&#xff1a;本文介绍如何仿真红绿灯 今天来做一个红绿灯仿真的程序&#xff0c;这个程序主要包括一下这些功能&#xff1a; 模拟的路口为十字交叉路口&#xff0c;假设东西和南北方向都是双向行驶&#xff0c;因此需要设置4组红绿灯和4个倒计时显示屏。倒计时时间最长为9…

.NET高级面试指南专题七【SocketWebSocket】

Socket&#xff08;套接字&#xff09;是一种在计算机网络中实现通信的一种机制&#xff0c;它提供了一种标准的接口&#xff0c;使不同计算机上的程序能够通过网络进行数据交换。Socket允许在网络中的不同设备之间建立连接&#xff0c;进行双向的数据传输。 Socket通常用于实现…

C语言学习day13:for循环练习(生成随机数)

题目&#xff1a; 通过程序随机一个1-100的数&#xff0c;用户通过键盘输入数字 看是否匹配&#xff0c;匹配成功则跳出循环&#xff0c;失败则继续循环。 思路&#xff1a; 然后生成一个随机数需要写成死循环&#xff0c;同时需要有其他的出口可以写一个提示&#xff0c;比…

猫头虎分享已解决Bug || 任务调度失败(Cron Job Failure):CronJobError, ScheduledTaskFailure

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

炫酷3D按钮

一.预览 该样式有一种3D变换的高级感&#xff0c;大家可以合理利用这些样式到自己的按钮上 二.代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice…

URL编码算法:解决特殊字符在URL中的烦恼

引言&#xff1a; URL编码算法是一种将URL中的特殊字符转换为特定格式的编码方式。它在网络传输中起到了保护数据安全与完整性的重要作用。本文将深入探讨URL编码算法的优点与缺点&#xff0c;并介绍它在Web开发、网络安全等方面的应用。 URL编码解码 | 一个覆盖广泛主题工具…