【动态规划】P8638 [蓝桥杯 2016 省 A] 密码脱落

news2025/4/7 23:02:27

题解:P8638 [蓝桥杯 2016 省 A] 密码脱落

题目传送门:P8638 密码脱落

一、题目描述

考古学家发现了一些由 A、B、C、D 四种种子组成的密码串,这些串原本是回文串(前后对称),但由于部分种子脱落,现在可能不再对称。我们需要计算最少脱落了多少个种子才能变成现在看到的样子。

二、题目分析

给定一个字符串,我们需要找到一个最接近它的回文串,使得当前字符串是该回文串的子序列(可以通过删除字符得到)。最少脱落数即为原字符串长度减去其最长回文子序列的长度。

三、问题思考

算法分析

  • 回文串性质:正读反读相同,如 “ABCBA”
  • 子序列:不改变字符顺序,删除任意数量字符得到的序列
  • 关键转化:最少脱落数 = 字符串长度 - 最长回文子序列长度

前置知识

  • 动态规划:用于高效计算最长回文子序列
  • 字符串反转:回文串的反转是其本身,利用此性质可以转化为最长公共子序列问题

四、动态规划思路

a. 状态表示

定义 f[i][j] 表示原字符串前 i 个字符与反转字符串前 j 个字符的最长公共子序列长度

b. 初始化

f[0][j] = f[i][0] = 0(空字符串的公共子序列长度为0)

c. 状态转移

  • s1[i-1] == s2[j-1] 时:f[i][j] = f[i-1][j-1] + 1
  • 否则:f[i][j] = max(f[i-1][j], f[i][j-1])

d. 最终结果

最少脱落数 = 字符串长度 n - f[n][n]

五、代码实现

#include <bits/stdc++.h>
using namespace std;

string s1, s2;
int f[1010][1010]; // DP数组

void solve() {
    cin >> s1;
    s2 = s1;
    reverse(s2.begin(), s2.end()); // 反转字符串
    
    int n = s1.size();
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            if (s1[i-1] == s2[j-1]) {
                f[i][j] = f[i-1][j-1] + 1; // 字符匹配时长度+1
            } else {
                f[i][j] = max(f[i-1][j], f[i][j-1]); // 不匹配时取较大值
            }
        }
    }
    cout << n - f[n][n]; // 输出最少脱落数
}

int main() {
    ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    solve();
    return 0;
}

六、重点细节

  1. 字符串索引:C++中字符串从0开始,所以比较的是s1[i-1]s2[j-1]
  2. DP数组初始化:全局数组自动初始化为0,无需手动初始化
  3. 反转字符串:通过反转将回文问题转化为LCS问题
  4. 最终计算n - f[n][n]直接得到结果

七、复杂度分析

  • 时间复杂度:O(n²),双重循环遍历字符串
  • 空间复杂度:O(n²),使用二维DP数组

八、总结

本题通过将原问题转化为最长公共子序列问题,巧妙地利用动态规划求解。关键点在于:

  1. 理解回文串与反转字符串的关系
  2. 掌握动态规划的状态转移方程
  3. 正确处理字符串索引和边界条件

这种将复杂问题转化为经典算法问题的思路,在竞赛编程中非常实用。

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

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

相关文章

前端知识点---本地存储(javascript)

localStorage 是浏览器提供的一个 本地存储 API&#xff0c;可以在用户的浏览器中存储数据&#xff0c;数据不会随页面刷新而丢失。 1. 基本用法 (1) 存储数据&#xff08;setItem&#xff09; localStorage.setItem("username", "zhangsan");存储 “use…

QML 批量创建模块 【Repeater】 组件详解

在 QML 中&#xff0c;Repeater 组件是一种非常实用的工具&#xff0c;能够批量创建控件&#xff0c;尤其是在我们需要根据数据动态生成多个相同类型的控件时。无论是列表、网格&#xff0c;还是动态生成按钮、标签等控件&#xff0c;Repeater 都能轻松胜任。 1. Repeater 组件…

【Python】Python 环境 + Pycharm 编译器 官网免费下载安装(图文教程,新手安装,Windows 10 系统)

目录 Python 环境的下载安装第一步 进入官网第二步 找到匹配 windows 系统的 python 下载页面第三步 根据电脑 cpu 架构选择 python 版本第四步 安装 python 环境第五步 验证 python 环境变量 Pycharm 的下载安装第一步 进入官网第二步 安装 Pycharm Community Edition第三步 第…

在 Elasticsearch 中使用 Amazon Nova 模型

作者&#xff1a;来自 Elastic Andre Luiz 了解如何在 Elasticsearch 中使用 Amazon Nova 系列模型。 在本文中&#xff0c;我们将讨论 Amazon 的 AI 模型家族——Amazon Nova&#xff0c;并学习如何将其与 Elasticsearch 结合使用。 关于 Amazon Nova Amazon Nova 是 Amazon …

sql server数据库可疑修复

sql server数据库可疑修复 从上图可以看到数据库nchrdb显示可疑&#xff0c;导致原因为NC系统在增加公共薪资项目的时候&#xff0c;扩展字段报错了&#xff0c;第一次遇到这种情况&#xff0c;折腾了很久终于解决&#xff0c;记下解决方案&#xff1a; 1&#xff0c;将SQL数据…

【项目管理-高项】学习方法 整体概览

相关文档&#xff0c;希望互相学习&#xff0c;共同进步 风123456789&#xff5e;-CSDN博客 1.背景 &#x1f4dd; 软考高项,全称 信息系统项目管理师 ,是软考高级资格项目之一。 本考试考三门科目&#xff1a;综合知识&#xff08;上午&#xff09;、案例分析&#xff08;下午…

【Linux网络与网络编程】05.应用层自定义协议序列化和反序列化

前言 本篇博客通过网络计算器的实现来帮助各位理解应用层自定义协议以及序列化和反序列化。 一、认识自定义协议&&序列化和反序列化 我们程序员写的一个个解决我们实际问题&#xff0c;满足我们日常需求的网络程序都是在应用层。前面我们说到&#xff1a;协议是一种…

Flutter之页面布局二

目录&#xff1a; 1、列表布局1.1、基础列表1.2、水平滑动的列表1.3、网格列表1.3、不同列表项的列表1.4、包含间隔的列表1.6、长列表 2、滚动2.1、浮动的顶栏2.2、平衡错位滚动 1、列表布局 1.1、基础列表 import package:flutter/material.dart;void main() > runApp(con…

RCE漏洞的小点总结

RCE简介与危害&#xff1a;包括远程代码执行和远程命令执行漏洞。 在很多web应用中&#xff0c;开发人员会使用一些函数&#xff0c;这些函数以一些字符串作为输入&#xff0c;功能是将输入的字符串当作代码或者命令来进行执行。当用户可以控制这些函数的输入时&#xff0c;就…

单片机实现多线程的方法汇总

在单片机上实现“多线程”的方法有几种&#xff0c;下面按照从简单到复杂、从轻量到系统性来列出常见的方案&#xff1a; &#x1f9f5; 一、伪多线程&#xff08;最轻量&#xff09; 方法&#xff1a;主循环 状态机 / 定时器轮询 主循环中轮流调用各个任务的处理函数&#x…

Java八股文-List集合

集合的底层是否加锁也就代表是否线程安全 (一)List集合 一、数组 array[1]是如何通过索引找到堆内存中对应的这块数据的呢? (1)数组如何获取其他元素的地址值 (2)为什么数组的索引是从0开始的&#xff0c;不可以从1开始吗 (3)操作数组的时间复杂度 ①查找 根据索引查询 未…

从零构建大语言模型全栈开发指南:第四部分:工程实践与部署-4.2.3行业案例:智能客服中的图文交互系统

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 从零构建大语言模型全栈开发指南-第四部分:工程实践与部署4.2.3 行业案例:智能客服中的图文交互系统1. 图文交互系统的核心挑战与价值2. 系统架构设计2.1 分层架构2.2 Adapter技术应用3. 行业应用案例…

华为IP(4)

VRRP&#xff08;虚拟路由冗余协议&#xff09; 前言&#xff1a; 局域网中的用户终端通常采用配置一个默认网关的形式访问外部网络&#xff0c;如果默认网关设备发生故障&#xff0c;那么所有用户终端访问外部网络的流量将会中断。可以通过部署多个网关的方式来解决单点故障…

计算机网络中科大 - 第1章 结构化笔记(详细解析)

博主主页 目录 **1. 计算机网络概述****1.1 计算机网络的定义****1.2 计算机网络的发展** **2. 计算机网络的组成与分类****2.1 计算机网络的组成****2.2 计算机网络的分类****按地理范围****按拓扑结构****按交换方式** **3. 计算机网络的性能指标****4. 计算机网络体系结构**…

【神经网络】python实现神经网络(三)——正向学习的模拟演练

有了之前的经验(【神经网络】python实现神经网络(二)——正向推理的模拟演练),我们继续来介绍如何正向训练神经网络中的超参(包含权重以及偏置),本章大致的流程图如下: 一.损失函数 神经网络以某个指标为基准寻求最优权重参数,而这个指标即可称之为 “损失函数” 。(…

PPTAgent:一款开源免费生成和评估幻灯片的项目

这篇文章介绍一下PPTAgent&#xff0c;一个从文档自动生成演示文稿的创新系统。该系统从人类的展示创作方法中汲取灵感&#xff0c;采用两步流程来确保卓越的整体质量。此外&#xff0c;本文还介绍了PPTEval&#xff0c;这是一个综合评估框架&#xff0c;可以跨多个维度评估演示…

Java 大视界 -- Java 大数据在智能供应链库存优化与成本控制中的应用策略(172)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

斯坦福大学李飞飞团队新突破!FlowMo 革新图像 Tokenizer

当我们悠然刷着手机&#xff0c;看到一张可爱猫咪的照片时&#xff0c;大脑会瞬间识别出「这是一只猫」&#xff0c;这一切不过是电光火石间的事儿。但在计算机的 “眼中”&#xff0c;情况却复杂得超乎想象。假设这是一张10001000像素的彩色照片&#xff0c;在计算机的世界里&…

博客文章:深入分析 PyMovie - 基于 Python和 MoviePy 的视频管理工具

这是一个使用 wxPython 构建界面、moviepy 处理视频的自定义 GUI 应用程序。该工具提供了视频播放、元数据提取、格式转换、视频裁剪和截图等功能。通过分析其设计和实现&#xff0c;我们将了解其工作原理、优点和潜在的改进空间。 C:\pythoncode\new\output\pymovieSample.py …

2025年渗透测试面试题总结-某 携程旅游-基础安全工程师(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 携程旅游-基础安全工程师 反序列化原理 核心原理 扩展分析 SQL注入本质 核心原理 扩展分析 SQL注…