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

相关文章

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

目录 一、前端问题 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

超级 密码加密 解密 源码,支持表情,符号,数字,字母,加密

超级 密码加密 解密 源码,支持表情,符号,数字,字母,加密 可以将表情,动物,水果,表情,手势,猫语,兽语,狗语,爱语,符号,数字,字母,加密和解密 可以将文字、字母、数字、代码、标点符号等内容转换成新的文字形式,通过简单的文字以不同的排列顺序来表达不同的内容 源码截图: https://www.httple.net/152649.html

mysql导出导入数据和修改登录密码

导出表结构: mysqldump -uroot -ppassword -d dbname tablename>db.sql; 导出表数据: mysqldump -t dbname -uroot -ppassword > db.sql 导出表结构和数据(不加-d): mysqldump -uroot -ppassword dbname tablename > db.sql;

Ubuntu 环境下ssh的安装、使用以及免密码登录

以两台机器为例:     A12.12.10.11B12.12.10.13 安装: Ubuntu默认安装了ssh客户端,只需要在被登录的机器上安装ssh服务器即可: $ sudo apt-get install openssh-server     启动ssh服务器: $ sudo /etc/init.d/ssh start 查看是否启动成功: $ ps -ef |grep

ubuntu 20.04 一直卡在登录界面,即使密码正确也无法登录(失败记录)

ubuntu 20.04 一直卡在登录界面,即使密码正确也无法登录 这次是装实体机,一次失败的尝试。。。 名称型号CPUIntel Xeon E5-2673 V3GPURTX 3060 mobile 安装的时候不要选install third-party software for graphics and Wi-fi hardware and additional media

oracle密码维护

查看密码是否可以重复使用 SQL> select PROFILE,RESOURCE_NAME,LIMIT from dba_profiles where profile='DEFAULT' and resource_type ='PASSWORD'; PROFILE                        RESOURCE_NAME                    LIMIT ----

【网络安全】古典密码体制概述

1. 古典密码体制概述 1.1 定义与历史背景 古典密码体制是指在计算机科学和信息安全技术出现之前的传统加密方法。这些方法主要包括替换和易位两种基本形式。古典密码体制的特点是简单、易用,但安全性不高,容易被破解。在古代,人们使用纸、笔或简单的器械来实现加密和解密操作。 定义:古典密码体制是基于简单数学运算和文字替换的加密方法,包括替代密码和置换密码两大类。历史背景:古典密码的使用可以追溯到古

vsftpd配置用户和密码让其他客户端连接

一、第一个主机:vsftpd下载及配置 前置准备: #卸载防火墙yum -y remove firewalld#为了不让防火墙有影响,iptables配置也清空iptables -Fvim /etc/selinux/confSELINUX=disabled #主要是把它改为disabled或者permissiveSELINUXTYPE=targeted#重启linux让selin