P1435 [IOI2000] 回文字串 / [蓝桥杯 2016 省] 密码脱落

2024-01-30 09:38

本文主要是介绍P1435 [IOI2000] 回文字串 / [蓝桥杯 2016 省] 密码脱落,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

快速链接

  • 原题链接
  • 题目大意
  • 输入格式
  • 输出格式
  • 数据范围
  • 解题思路
  • 上代码


原题链接

P1435
题目类型: 普 及 + / 提 高 {\color{yellow} 普及+/提高} +/
AC记录:Accepted

题目大意

回文词是一种对称的字符串。任意给定一个字符串,通过插入若干字符,都可以变成回文词。此题的任务是,求出将给定字符串变成回文词所需要插入的最少字符数。

输入格式

一个字符串。

输出格式

有且只有一个整数,即最少插入字符数

S a m p l e \mathbf{Sample} Sample I n p u t \mathbf{Input} Input

Ab3bd

S a m p l e \mathbf{Sample} Sample O u t p u t \mathbf{Output} Output

2

H i n t & E x p l a i n \mathbf{Hint\&Explain} Hint&Explain
字符串变成dAb3bAdAdb3bdA

数据范围

对于 100 % 100\% 100%的数据, 1 ≤ l e n g t h ≤ 1000 1≤length\le 1000 1length1000

解题思路

d p dp dp,就是 d p dp dp
其实这题看起来难,实际上很简单。
由于要计算回文的关系,首先设原来的字符串为 a a a,反转后的字符串为 b b b,即如果a="abc",则b="cba"。如果说,两个字符串里面都有同一个字符,那么这一个字符就不用被记入添加范围。否则,在原来的字符串中要加入一个同样的字符,所以,本题就变成了一个 求 最 长 公 共 子 序 列 \color{red}求最长公共子序列 的问题。


求最长公共子序列,无非就是把字符从两个字符串一个一个插入,然后进行动态转移。设 f i , j f_{i,j} fi,j为字符串 a a a中的前 i i i个字符与字符串 b b b中的前 j j j个字符的最长上升子序列的长度,考虑一下,如果两边插入的字符是一样的,那么就是从在没有插入这两个字符的情况中 + 1 +1 +1,即 f i , j = f i − 1 , j − 1 + 1 f_{i,j}=f_{i-1,j-1}+1 fi,j=fi1,j1+1。但如果不一样呢?那就要考虑前后顺序了。你可以先插入 a a a中,或者先插入 b b b中,即 f i , j = max ⁡ ( f i − 1 , j , f i , j − 1 ) f_{i,j}=\max(f_{i-1,j},f_{i,j-1}) fi,j=max(fi1,j,fi,j1)。整理,得:
f i , j = { f i − 1 , j − 1 + 1 a i = b j max ⁡ ( f i − 1 , j , f i , j − 1 ) a i ≠ b j f_{i,j}=\begin{cases} f_{i-1,j-1}+1 & a_i=b_j \\ \max(f_{i-1,j},f_{i,j-1}) & a_i\ne b_j \end{cases} fi,j={fi1,j1+1max(fi1,j,fi,j1)ai=bjai=bj
最后的答案就是 a . l e n g t h − f a . l e n g t h , a . l e n g t h a.length-f_{a.length,a.length} a.lengthfa.length,a.length

注意:

1.如果说 a a a的长度太大,例如 1 ≤ a . l e n g t h ≤ 5000 1\le a.length\le 5000 1a.length5000的话,平常的二维数组就不能使用了,要使用滚动数组
2.因为求出来的最长公共子序列是不被计算在答案里面的(不懂的再看一遍上面),所以在计算答案的时候要减去最长公共子序列的长度。


最后,祝大家早日
请添加图片描述

上代码

#include<iostream>
#include<cstring>using namespace std;string      a,b;
int         n;
int         f[3][5010];void work(string x,string y)
{for(int i=1; i<=x.size(); i++){for(int j=1; j<=y.size(); j++){if(x[i-1]==y[j-1])f[2][j]=f[1][j-1]+1;elsef[2][j]=max(f[1][j],f[2][j-1]);}for(int j=1; j<=y.size(); j++)f[1][j]=f[2][j];}return;
}int main()
{// cout<<sizeof(f)/1024<<" KB"<<endl;cin>>a;n=a.size();b=a;for(int i=0,j=a.size()-1; i<j; i++,j--)swap(b[i],b[j]);work(a,b);cout<<n-f[1][n]<<endl;return 0;
}

完美切题 ∼ \sim

这篇关于P1435 [IOI2000] 回文字串 / [蓝桥杯 2016 省] 密码脱落的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/659810

相关文章

Oracle登录时忘记用户名或密码该如何解决

《Oracle登录时忘记用户名或密码该如何解决》:本文主要介绍如何在Oracle12c中忘记用户名和密码时找回或重置用户账户信息,文中通过代码介绍的非常详细,对同样遇到这个问题的同学具有一定的参... 目录一、忘记账户:二、忘记密码:三、详细情况情况 1:1.1. 登录到数据库1.2. 查看当前用户信息1.

SpringBoot使用Jasypt对YML文件配置内容加密的方法(数据库密码加密)

《SpringBoot使用Jasypt对YML文件配置内容加密的方法(数据库密码加密)》本文介绍了如何在SpringBoot项目中使用Jasypt对application.yml文件中的敏感信息(如数... 目录SpringBoot使用Jasypt对YML文件配置内容进行加密(例:数据库密码加密)前言一、J

MySQL9.0默认路径安装下重置root密码

《MySQL9.0默认路径安装下重置root密码》本文主要介绍了MySQL9.0默认路径安装下重置root密码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录问题描述环境描述解决方法正常模式下修改密码报错原因问题描述mysqlChina编程采用默认安装路径,

MySQL修改密码的四种实现方式

《MySQL修改密码的四种实现方式》文章主要介绍了如何使用命令行工具修改MySQL密码,包括使用`setpassword`命令和`mysqladmin`命令,此外,还详细描述了忘记密码时的处理方法,包... 目录mysql修改密码四种方式一、set password命令二、使用mysqladmin三、修改u

电脑密码怎么设置? 一文读懂电脑密码的详细指南

《电脑密码怎么设置?一文读懂电脑密码的详细指南》为了保护个人隐私和数据安全,设置电脑密码显得尤为重要,那么,如何在电脑上设置密码呢?详细请看下文介绍... 设置电脑密码是保护个人隐私、数据安全以及系统安全的重要措施,下面以Windows 11系统为例,跟大家分享一下设置电脑密码的具体办php法。Windo

数据库oracle用户密码过期查询及解决方案

《数据库oracle用户密码过期查询及解决方案》:本文主要介绍如何处理ORACLE数据库用户密码过期和修改密码期限的问题,包括创建用户、赋予权限、修改密码、解锁用户和设置密码期限,文中通过代码介绍... 目录前言一、创建用户、赋予权限、修改密码、解锁用户和设置期限二、查询用户密码期限和过期后的修改1.查询用

Java中的密码加密方式

《Java中的密码加密方式》文章介绍了Java中使用MD5算法对密码进行加密的方法,以及如何通过加盐和多重加密来提高密码的安全性,MD5是一种不可逆的哈希算法,适合用于存储密码,因为其输出的摘要长度固... 目录Java的密码加密方式密码加密一般的应用方式是总结Java的密码加密方式密码加密【这里采用的

mysql重置root密码的完整步骤(适用于5.7和8.0)

《mysql重置root密码的完整步骤(适用于5.7和8.0)》:本文主要介绍mysql重置root密码的完整步骤,文中描述了如何停止MySQL服务、以管理员身份打开命令行、替换配置文件路径、修改... 目录第一步:先停止mysql服务,一定要停止!方式一:通过命令行关闭mysql服务方式二:通过服务项关闭

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

C语言蓝桥杯

一、语言基础 竞赛常用库函数 最值查询 min_element和max_element在vector(迭代器的使用) nth_element函数的使用 例题lanqiao OJ 497成绩分析 第一种用min_element和max_element函数的写法 第二种用min和max的写法 二分查找 二分查找只能对数组操作 binary_s