[POJ - 1080 ]Palindrome(区间DP)

news2024/11/17 14:48:14

[POJ - 1080 ]Palindrome( 区间DP)

  • 1、问题
  • 2、分析
      • 状态表示
      • 状态转移
      • 空间优化
  • 3、代码

1、问题

给定一个字符串,通过添加最少的字符,使得这个字符串成为一个回文字符串。
在这里插入图片描述

2、分析

状态表示

f [ i ] [ j ] f[i][j] f[i][j]表示将区间 [ i , j ] [i,j] [i,j]的字符串变成回文串时,添加的最小字符数。

状态转移

在写状态转移方程之前,我们先来分析一下这道题。因为这道题是让我们判断一个回文串,所以我们很自然地想到,应该从两端向中间扫描,这样我们才能判断该字符串是否为回文串。

如下图:
在这里插入图片描述
假设我们的 i i i j j j走到了图中的位置,现在需要判断这两个字符是否相等,很明显,按照图中的例子来看,这两个字符是不相等的。
如果不相等话,我们就需要插入字符。插入字符的话,我们就有两个选择,一个是在C的后面插入一个A。如下图所示:
在这里插入图片描述
当我们加上一个A以后,原来在 i i i位置的字符 A A A和我们插入的 A A A配对,此时我们的 j j j就只能去和 i + 1 i+1 i+1匹配。

当然,我们还有另外一个选择,就是将 A A A前面加一个 C C C,如下图所示:
在这里插入图片描述
同理,我们插入一个字符 C C C以后,我们的 i i i处所对应的字符,就可以去和第 j − 1 j-1 j1个字符匹配了。
那么我们能否选择不在两端插入字符,而是在对中间字符串匹配的过程中,插入一些字符,而使得现在两端的字符自动匹配成功呢?
答案是不可能的。
因为无论我们在中间插入多少个字符, i i i位置的 A A A j j j位置的 C C C字符依旧是在两端,所以二者依旧是不匹配的。

综合上述三种情况,就可以得出一个结论,在我们向中间扫面的过程中,如果没有匹配成功的话,就必须在两端插入一个新的字符,只不过到底是在前面插入,还是在后面插入,需要靠我们自行比较一下。

现在,还有一个问题,当我们插入一个字符后,对之前已经匹配的字符是否有影响呢?
答案是没有影响的。
在这里插入图片描述
在上面这个图中,两侧的黑色框是已经匹配的字符,当我们插入字符后,其实并不影响两侧的黑色框。所以是没有影响的。

通过上述的讨论,我们就能总结出状态转移方程。
f [ i ] [ j ] = { m i n ( f [ i + 1 ] [ j ] , f [ i ] [ j − 1 ] ) + 1 s [ i ] ≠ s [ j ] f [ i − 1 ] [ j − 1 ] + 1 s [ i ] = s [ j ] f[i][j]= \begin{cases} min(f[i+1][j],f[i][j-1])+1&s[i]\neq s[j] \\f[i-1][j-1]+1&s[i]=s[j] \end{cases} f[i][j]={min(f[i+1][j],f[i][j1])+1f[i1][j1]+1s[i]=s[j]s[i]=s[j]

空间优化

这道题的数据范围比较大,所以需要我们改成滚动数组的形式,即 & 1 \&1 &1即可。

3、代码

#include<iostream>
#define endl '\n'
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N = 5e3 + 10;
char s[N];
int f[3][N];

void solve()
{
	int n;
	cin >> n;
	cin >> s + 1;
	for(int i = n; i >= 1; i --)
	{
		for(int j = i; j <= n; j ++ )
		{
			if(s[i] == s[j])
				f[i % 2][j] = f[(i + 1) % 2][j - 1];
			else
				f[i % 2][j] = min(f[(i + 1) % 2][j], f[i % 2][j - 1]) + 1;
		}
	}
	cout << f[1][n] << endl;
}

signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	solve();
}

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

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

相关文章

2023年产品经理需要考的证书,NPDP含金量真高

产品经理国际资格认证NPDP是新产品开发方面的认证&#xff0c;集理论、方法与实践为一体的全方位的知识体系&#xff0c;为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。 【认证机构】 产品开发与管理协会&#xff08;PDMA&#xff09;成立于1979年&#xff0c;是…

盖子的c++小课堂——第十七讲:递归

前言 通知一下&#xff0c;以后每周不定期更新&#xff0c;有可能是周六更新&#xff0c;也可能是周日吧&#xff0c;反正会更新的~~还有我新出的专栏《跟着盖子读论语》&#xff0c;记得订阅一下啊跟着盖子学《论语》_我叫盖子的盖鸭的博客-CSDN博客 三元表达式 三元表达式…

单链表中二级指针的使用以及单链表的增删查改操作

前言&#xff1a;在链表的构建中,链表的初始化和销毁为何需要使用一个二级指针,而不是只需要传递一个指针就可以了,其问题的关键就在于c语言的参数传递的方式是值传递 那么,这篇文章就来聊一聊在链表的初始化中一级指针的传递和二级指针的区别&#xff0c;并总结给出单链表的C语…

AutoCAD使用技巧

AutoCAD使用技巧 环境说明AutoCAD 导入EXCELAutoCAD移动对象到原点 环境说明 本文基于AutoCAD 2021版本。 AutoCAD 导入EXCEL 如果菜单栏隐藏点击显示菜单栏&#xff1a; 在excel中选中copy内容赋值&#xff0c;AutoCAD中选择&#xff1a;编辑-选择性粘贴-作为AutoCAD图元…

必用WhatsApp营销的4个理由

WhatsApp是世界上最受欢迎的消息传递应用程序。每天有1万新用户加入WhatsApp。各种规模的公司都利用该平台与世界各地的客户进行有效的沟通&#xff0c;这要归功于其广泛的覆盖范围、用户友好的设计和安全的端到端加密。因此&#xff0c;WhatsApp聊天机器人迅速普及。 1.为您的…

Kotlin的出现无疑是为了超越Java而存在

Kotlin的出现无疑是为了超越Java而存在。在Google I/O 2017中&#xff0c;Google 宣布 Kotlin 成为 Android 官方开发语言&#xff0c;背景就是Oracle告Google侵权使用java。众所周知&#xff0c;Java的跨平台的开发语言&#xff0c;得益于虚拟机。我比较关注Kotlin用于Android…

Python 使用pipreqs命令生成 `requirements.txt`报错

Python 使用pipreqs命令生成 requirements.txt报错&#xff1a;Fatal error in launcher: Unable to create process using ‘“E:\Anaconda\python.exe” “D:\Anaconda\Scripts\pipreqs.exe” ./ --encodingutf-8’: ??? 问题描述—Python 使用pipreqs命令生成 requireme…

47.对齐网格项目和轨道

首先我们先将模块1关闭&#xff0c;模块2使用CSS网格 display: none;.container--2 {/* STARTER */font-family: sans-serif;background-color: black;font-size: 40px;margin: 100px;width: 1000px;height: 600px;/* CSS GRID */display: grid;}然后我们常间一个三列两行的网…

STM32开发(十六)STM32F103 片内资源 —— 实时时钟RTC 详解

文章目录 一、基础知识点二、开发环境三、STM32CubeMX相关配置四、Vscode代码讲解五、结果演示串口显示乱码解决方案 一、基础知识点 本实验通过stm32片内资源RTC实现实时时钟&#xff0c;通过数码管显示时间。设定闹钟&#xff0c;实现准点报时。 数码管相关知识点&#xff1…

maven总结

maven maven1.构建依赖2.依赖冲突的规则3.可选依赖和排除依赖可选依赖排除依赖 4.依赖范围5.项目构建生命周期6.插件7.模块聚合8.模块继承9.属性&#xff08;类似常量&#xff09;&#xff08;1&#xff09; 自定义属性&#xff08;2&#xff09;直接调用内置属性 10.多个环境配…

PingPingPing

拿到题的时候我是没有丝毫的思路&#xff0c;可能是没有做过太多命令注入的题目&#xff0c;所以反应不过来 还是查看的别人的wp&#xff0c;得知这是一道有关命令注入的题目 通过页面提示传入ip并且利用管道符查看所有文件 但是当我们查看flag.php的时候发现页面过滤掉了空格 …

诊断DTC故障码两种形式的转换:符号转数字

诊断DTC code数据由3个字节组成:HighByte + MiddleByte + LowByte。有两种表现形式: 数字:三个字节值用16进制表示,比如0xC07304符号:这种形式更直观地用字符描述该DTC故障所属的系统,故障类型等信息我们重点讲一下符号的形式: 字符形式的DTC故障码,由7个字符组成,代…

Chatbox - 一款适用于 GPT-4 / GPT-3.5 (OpenAI API) 的桌面应用程序

简介 给大家推荐一款适用于 GPT-4 / GPT-3.5 (OpenAI API) 的桌面应用程 ChatBox&#xff0c;开源的 ChatGPT API (OpenAI API) 跨平台桌面客户端&#xff0c;Prompt 的调试与管理工具&#xff0c;也可以用作 ChatGPT Plus 平替。 下载 ► chatBox 下载安装 ⇲ 为什么不直接…

3D目标检测--PointPillars论文和OpenPCDet代码解读

文章目录 1. 论文动机2. PointPillars概述3. PointPillars模型3.1 Pillar Feature Net3.1.1 Pillar Feature Net模块理论解析3.1.2 Pillar Feature Net模块代码解析 3.2 Backbone&#xff08;2D CNN&#xff09;3.2.1 Backbone&#xff08;2D CNN&#xff09;模块理论解析3.2.2…

LeetCode 312. Burst Balloons【区间DP】困难

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

校验规则引擎

目录 一 架构设计图 二 表设计及数据展示 三 顶层接口 四 压测结果 五 其他规则引擎比较 适用场景&#xff1a;校验场景以及使用该思想进行可视化配置化开发&#xff08;可大幅提高开发效率&#xff0c;长期维护简单&#xff09; 例如&#xff1a;履约系统下单中的校验&…

C++(初识结束)

目录 4缺省参数 4.1缺省参数的概念 4.2缺省参数分类 4.3缺省参数的应用 5.函数重载 5.1函数重载概念 5.2c支持函数重载的原理-名字修饰&#xff08;name Mangling&#xff09; 6.引用 6.1引用概念 6.2引用特性 6.3常引用 6.4使用场景 6.4.1做参数 6.4.2做返…

2023年4月-近期看书

复习书记 用于读书 文章目录 复习书记一、(2001)控制工程基础二、(3001)交通管理与控制三、(1001)英语 一、(2001)控制工程基础 学习这本书的前6章节。 参看视频链接&#xff1a; https://www.bilibili.com/video/BV1Sb411q7jU?p8&spm_id_frompageDriver&vd_source…

构建完善的帮助中心:降低企业客户服务成本,提高客户满意度

客户服务是企业成功的关键之一&#xff0c;一家公司的成功不仅仅取决于产品或服务的质量&#xff0c;还在于能否为客户提供优质的客户服务。随着现代科技的发展&#xff0c;企业需要面对越来越多的客户服务需求&#xff0c;不良的客户服务将对企业的声誉和业务产生严重的影响。…

马斯克爆料Twitter裁了八成员工;OpenAI CEO:GPT-5根本不存在;小鹏被曝年终奖打0.5折 | AI一周资讯

来源: AI前线 微信号&#xff1a;ai-front 整理 | 凌敏 微软宣布开源 Deep Speed Chat&#xff1b;消息称软银旗下 Arm 启动赴美 IPO&#xff1b;国家网信办出台生成式 AI 管理办法&#xff1b;前理想 AI 芯片一号位骄旸加入三星&#xff0c;负责组建 GPU 团队…… 资 讯 Op…