POJ1159

这竟然是IOI虽然是2000年的,但其实也改变不了它水题的本质

我写了两种方法,这里都讲一下吧

考虑记忆化搜索,用f[i][j]表示当区间的左端为i,右端为j时最少要添加多少字符,所以ans就为f[1][n]

然后考虑一下,对于每一个f[i][j],都有转移:

  • s[i]==s[j],则有f[i][j]=f[i+1][j-1]

  • s[i]!=s[j] ,则有f[i][j]=min(f[i+1][j],f[i][j-1])(左右两边加一个字符,看看那种情况更优)

这里连枚举的顺序也懒得推了,直接跑了个记忆化搜索就过了

CODE

#include<cstdio>
#include<cstring>
using namespace std;
const int N=5005;
short int f[N][N],n;
char s[N];
inline int min(int a,int b)
{return a<b?a:b;
}
inline void DP(int l,int r)
{if (l>=r) { f[l][r]=0; return; }if (s[l]==s[r]){if (f[l+1][r-1]==-1) DP(l+1,r-1);f[l][r]=f[l+1][r-1];} else{if (f[l+1][r]==-1) DP(l+1,r);if (f[l][r-1]==-1) DP(l,r-1);f[l][r]=min(f[l+1][r],f[l][r-1])+1;}
}
int main()
{scanf("%d%s",&n,s+1);memset(f,-1,sizeof(f));DP(1,n);printf("%d",f[1][n]);return 0;
}

注意这里的内存问题,开int的话都是要MLE的,但是由于数据范围5000,因此开short int足矣

还有一种算法,就是很套路的了

我们很轻易的发现,将原串倒过来之后,他们的最长公共子序列LCS都是不用再添加字符的,而对于其它的字符每个都要找一个字符与之相对应地匹配

证明不难,这里省略了,观察即可得出

LCS的DP方程也很简单,用f[i][j]表示第一个串前i个字符,第二个串前j个字符的LCS是多少,转移有

  • s[i]==s[j] f[i][j]=f[i-1][j-1]+1

  • s[i]!=s[j] f[i][j]=max(f[i-1][j],f[i][j-1])(之前的决策二选一)

是不是觉得和第一种的DP式有几分相似?其实他们本质上也是一样的!

所以又可以请出滚存来优化内存了

CODE

#include<iostream>
#include<string>
using namespace std;
const int N=5005;
int f[2][N],n;
string s1;
inline int max(int a,int b)
{return a>b?a:b;
}
int main()
{int i,j;ios::sync_with_stdio(false);cin>>n>>s1; string s2(s1.rbegin(),s1.rend());for (i=0;i<n;++i){int now=(i+1)&1,lst=now^1;for (j=0;j<n;++j)if (s1[i]==s2[j]) f[now][j+1]=f[lst][j]+1; else f[now][j+1]=max(f[lst][j+1],f[now][j]);}cout<<n-f[n&1][n]<<endl;return 0;
}

转载于:https://www.cnblogs.com/cjjsb/p/9029064.html

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

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

相关文章

c语言微信备份文件,文件保存后自动刷新微信小程序

微信开发者工具支持刷新和重建的快捷键&#xff0c;所以我们可以发送一段 apple script 脚本来达到刷新/重建项目的效果&#xff0c;从而免去手工切换再使用快捷键的麻烦。例如&#xff1a;tell application "wechatwebdevtools"activatedelay 0.2tell application &…

easyui 调用dialog中的方法_SolidWorks中标准件库的创建及调用方法

在使用SolidWorks进行产品设计时&#xff0c;常用的标准件&#xff08;如螺栓、螺母、垫圈等&#xff09;通常可以在安装了SolidWorksToolbox插件后调出使用&#xff0c;而许多标准件在Toolbox并不存在&#xff0c;不能从插件中直接调用。在用到这些零件时&#xff0c;设计人员…

牛客网--牛牛找工作

题目描述 为了找到自己满意的工作&#xff0c;牛牛收集了每种工作的难度和报酬。牛牛选工作的标准是在难度不超过自身能力值的情况下&#xff0c;牛牛选择报酬最高的工作。在牛牛选定了自己的工作后&#xff0c;牛牛的小伙伴们来找牛牛帮忙选工作&#xff0c;牛牛依然使用自己…

【测试设计】基于正交法的测试用例设计工具--PICT

前言 我们都知道成对组合覆盖是一种非常有效的测试用例设计方法&#xff0c;但是实际工作过程中当成对组合量太大&#xff0c;我们往往很难做到有效的用例覆盖。 PICT是微软公司出品的一款成对组合命令行生成工具,它很好的解决了上述的难题。使用它我们可以有效地按照两两测试的…

Alpha fold: 人工智能在蛋白质结构预测上跑赢人类的启示

来自孙卫涛科学网博客2020年12月&#xff0c;Alpha Fold2在CASP14上 获得了惊人的进步&#xff0c;其蛋白质结构预测的能力已经达到了与实验方法相媲美的程度&#xff0c;国内外该领域的专家学者都为之惊叹&#xff0c;同时也都感受到巨大的压力&#xff0c;人工智能首次把一个…

nginx解决浏览器跨域问题_前端通过Nginx反向代理解决跨域问题

在前面写的一篇文章SpringMVC解决跨域问题&#xff0c;我们探讨了什么是跨域问题以及SpringMVC怎么解决跨域问题&#xff0c;解决方式主要有如下三种方式:JSONPCORSWebSocket可是这几种方式都是基于服务器配置的&#xff0c;即对于自己的网站是可以通过这几种方式解决的&#x…

android view使用方法,android – 如何使用getView()方法,它在哪里被调用?

我是Android开发的新手&#xff0c;并且一直遵循Android网站上提供的教程。我目前在视图教程部分&#xff0c;特别是Grid Views&#xff1a;Hello, Grid View Tutorial的教程。我无法通过适配器了解视图的形式。我明白您必须覆盖适配器类中的getView()方法&#xff0c;并且在此…

牛客网--被3整除

题目描述 小Q得到一个神奇的数列: 1, 12, 123,...12345678910,1234567891011...。 并且小Q对于能否被3整除这个性质很感兴趣。 小Q现在希望你能帮他计算一下从数列的第l个到第r个(包含端点)有多少个数可以被3整除。 输入描述: 输入包括两个整数l和r(1 < l < r < …

卷积神经网络爬虫实现新闻在线分类系统

卷积神经网络&&爬虫实现网易新闻自动爬取并分类 项目地址 采用THUCnews全部数据集进行训练&#xff0c;效果如下。 详细实现见./text_classification 部署步骤如下&#xff1a; 运行环境 服务器&#xff1a;Ubuntu 16.04 数据库&#xff1a;Mysql 5.6 python&#xf…

搞基础理论研究有什么用?

来源&#xff1a;数学中国人类文明的诞生是一个奇迹&#xff0c;构筑在现代科学技术基础之上的现代人类文明的诞生更是奇迹中的奇迹。这个奇迹中的奇迹的根基是现代技术及其广泛应用&#xff0c;而现代技术的根基则是现代科学&#xff0c;科学的根基是以数学为主要工具的基础科…

android传感器博客,Android实现接近传感器

本文实例为大家分享了Android实现接近传感器的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下1.接近传感器检测物体与听筒(手机)的距离&#xff0c;单位是厘米。一些接近传感器只能返回远和近两个状态&#xff0c;如我的手机魅族E2只能识别到两个距离&#xff1a;0CM…

python 内存分析_python内存管理分析

本文较为详细的分析了python内存管理机制。分享给大家供大家参考。具体分析如下&#xff1a;内存管理&#xff0c;对于Python这样的动态语言&#xff0c;是至关重要的一部分&#xff0c;它在很大程度上甚至决定了Python的执行效率&#xff0c;因为在Python的运行中&#xff0c;…

牛客网--牛牛的闹钟

牛牛总是睡过头&#xff0c;所以他定了很多闹钟&#xff0c;只有在闹钟响的时候他才会醒过来并且决定起不起床。从他起床算起他需要X分钟到达教室&#xff0c;上课时间为当天的A时B分&#xff0c;请问他最晚可以什么时间起床 输入描述: 每个输入包含一个测试用例。 每个测试用…

由内而外:大脑是如何形成感官记忆的

大数据文摘出品来源&#xff1a;sciencedaily编译&#xff1a;张大笔茹通常&#xff0c;大脑会对我们感官收集的信息进行编码。为了感知环境并与之进行建设性的互动&#xff0c;这些感官信号需要在以往的经验和当前目标的背景下进行解释。最新一期的《科学》杂志上&#xff0c;…

android设置大小能用小数,Android中关于保留小数点位数的处理

保留两位小数方法一&#xff1a;{double c 3.154215;java.text.DecimalFormat myformatnew java.text.DecimalFormat("0.00");String str myformat.format(c);}方式二&#xff1a;{java.text.DecimalFormat df new java.text.DecimalFormat("#.00");df.…

oracle clob截取_Oracle数据库设计规范建议

Oracle-数据库设计规范建议来源于项目资料目的本规范的主要目的是希望规范数据库设计&#xff0c;尽量提前避免由于数据库设计不当而产生的麻烦&#xff1b;同时好的规范&#xff0c;在执行的时候可以培养出好的习惯&#xff0c;好的习惯是软件质量的很好的保证。数据库设计是指…

牛客网--19校招--俄罗斯方块

题目描述 小易有一个古老的游戏机&#xff0c;上面有着经典的游戏俄罗斯方块。因为它比较古老&#xff0c;所以规则和一般的俄罗斯方块不同。 荧幕上一共有 n 列&#xff0c;每次都会有一个 1 x 1 的方块随机落下&#xff0c;在同一列中&#xff0c;后落下的方块会叠在先前的方…

揭秘美国空军如何用AI技术提升“战斗力”

以AI技术为基础&#xff0c;美国空军正努力将自身转化为更强调协作性的组织。来源丨Forbes作者丨Kathleen Walch编译丨科技行者通过增加数据规模与相关素养提升&#xff0c;美国空军各部门及人员&#xff0c;将建立起更强的决策、战略、任务执行以及网络安全保障效率与能力。以…

android 查询wifi信息的类,Android 获取wifi信息

在androi中WIFI信息的获取可以通过系统提供的WIFI Service获取。WifiManager wifi_service (WifiManager)getSystemService(WIFI_SERVICE);WifiInfo wifiInfo wifi_service.getConnectionInfo();其中WifiInfo 中比较常用的信息有&#xff1a;/*info.getBSSID()&#xf…

bashsupport插件_如何用 bash-support 插件将 Vim 编辑器打造成编写 Bash 脚本的 IDE

IDE(集成开发环境)就是这样一个软件&#xff0c;它为了最大化程序员生产效率&#xff0c;提供了很多编程所需的设施和组件。 IDE 将所有开发工作集中到一个程序中&#xff0c;使得程序员可以编写、修改、编译、部署以及调试程序。在这篇文章中&#xff0c;我们会介绍如何通过使…