nyist oj 37 回文字符串 (动态规划经典)

回文字符串

时间限制:3000 ms  |  内存限制:65535 KB
难度:4
描写叙述
所谓回文字符串,就是一个字符串。从左到右读和从右到左读是全然一样的。比方"aba"。当然,我们给你的问题不会再简单到推断一个字符串是不是回文字符串。如今要求你,给你一个字符串,可在任何位置加入字符。最少再加入几个字符,能够使这个字符串成为回文字符串。
输入
第一行给出整数N(0<N<100)
接下来的N行。每行一个字符串,每一个字符串长度不超过1000.
输出
每行输出所需加入的最少字符数
例子输入
1
Ab3bd
例子输出
2
来源

IOI 2000

開始看到这道题的时候,一时想不出用什么非常好的方法来做。看到分类是在动态规划,也大致往这方面想。看了别人的思路。顿时茅塞顿开啊,直接把给定的字符串倒转,然后再和原字符串一起,求他们的最长公共序列,然后再拿字符串的长度减去他们的最长公共序列的长度,得到的就是要加入的最小的字符数。想到了这个地方,这个题目就非常好解啦;直接用LIC水过,状态方程式也和前面做过的题一样;

#include <cstdio>
#include <cstring>
#define max(a,b) a>b?a:b
const int maxn=1001;
char a[maxn],b[maxn];
int dp[maxn][maxn];//昨天晚上把DP的类型设置成了char型,然后提交一直wa,刷屏了。。

。不应该啊!。 int main() { int n,i,j,len; scanf("%d",&n); while(n--) { memset(a,0,sizeof(a)); memset(dp,0,sizeof(dp)); scanf("%s",a); len=strlen(a); for(i=len-1,j=0;i>=0;i--) b[j++]=a[i]; for(i=1;i<=len;i++) { for(j=1;j<=len;j++) { if(a[i-1]==b[j-1]) dp[i][j]=dp[i-1][j-1]+1;//递推关系 else dp[i][j]=max(dp[i-1][j],dp[i][j-1]); } } printf("%d\n",len-dp[len][len]); } }

看到别人的写的,用了还有一种思路,也是动态规划。可是递推关系有一点不同;有点没看懂;

省去了倒转的环节

 
#include<stdio.h>  
#include<string.h>  int f[1005][1005];  int main()  
{  int n;  scanf("%d",&n);  while (n--)  {  char s[1005];  scanf("%s",s);  int k,i,j,l=strlen(s);  for (i=0;i<l;++i) f[i][i]=0;  for (k=2;k<=l;++k)  {  for (i=0;i<=l-k;++i)  {  int p=i+k-1;  if (s[i]==s[p])  {  f[i][p]=f[i+1][p-1];  }  else   {  f[i][p]=1+(f[i][p-1]<f[i+1][p]?

f[i][p-1]:f[i+1][p]); } } } printf("%d\n",f[0][l-1]); memset(f,0,sizeof(f)); } return 0; }


看到别人的最优代码,内存占用的非常小。值得学习,另一种滚动数组。好像能够节约内存。还没有接触过;

 #include<stdio.h>
#include<string.h>
using namespace std;
int m[1000],i,j,t1,t2,len;
char s[1001];
int main() {int N;scanf("%d",&N);while(N--){scanf("%s",s);len=strlen(s);for(i=len-1;i>=0;i--){m[i]=0;t1=m[i];for(j=i+1;j<len;j++){t2=m[j];if(s[i]==s[j])m[j]=t1;elsem[j]=m[j-1]<m[j]?m[j-1]+1:m[j]+1;t1=t2;}}printf("%d\n",m[len-1]);}
}                



转载于:https://www.cnblogs.com/wzjhoutai/p/7222299.html

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

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

相关文章

iOS Application Security

文章分A,B,C,D 4个部分。 A) iOS Application Security 下面介绍iOS应用安全&#xff0c;如何分析和动态修改app。 1&#xff09;iOS Application security Part 1 – Setting up a mobile pentesting platform Part1介绍如何在越狱的设备上搭建用来测试iOS安全的环境。 2&…

openlayers基础系列教程(一)

openlayers基础系列教程(一) http://www.openlayers.cn/portal.php?modview&aid19

【51单片机快速入门指南】4.2: SSD1306 OLED屏(0.96寸、1.3寸)的I2C控制详解

目录硬知识SSD1306简介I2C 接口从机地址位&#xff08;SA0&#xff09;I2C 总线写数据命令解码器晶振电路和显示时间发生器复位图形显示数据RAM (GDDRAM)命令表基本命令表部分指令详解为 BANK0 设置对比度控制&#xff08;81h&#xff09;全部显示开启&#xff08;A4h/A5h&…

使用GNS3和Cisco IOU搭建路由交换实验-安装篇

如何使用GNS3和Cisco IOU搭建路由交换实验-安装篇GNS3软件的安装建议大家从官网直接下载最新版本的GNS3&#xff0c;官网连接http://www.gns3.com/根据系统类型选择相应的版本&#xff0c;这里我选择的是Windwos系统的最新版本1.3.2下载好安装包后直接运行安装包&#xff0c;在…

符号代码写法大全

摘自&#xff1a;http://www.w3schools.com/tags/ref_symbols.asp Math Symbols Supported by HTML CharacterEntity NumberEntity NameDescription∀&forall;for all∂&part;part∃&exist;exists∅&empty;empty∇&nabla;nabla∈&isin;isin∉&noti…

解决问题E: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) E: 无法锁定管理目录,

在用sudo apt-get install kmymoney2安装软件kmymoney2时&#xff0c;由于速度太慢&#xff0c;想换个软件源&#xff0c;直接关闭了终端&#xff0c;apt&#xff0d;get但进程没有结束&#xff0c;结果终端提示 &#xff1a;“E: 无法获得锁 /var/lib/dpkg/lock - open (11: 资…

1787: [Ahoi2008]Meet 紧急集合

1787: [Ahoi2008]Meet 紧急集合 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 1482 Solved: 652[Submit][Status][Discuss]Description Input Output Sample Input 6 4 1 2 2 3 2 4 4 5 5 6 4 5 6 6 3 1 2 4 4 6 6 6 Sample Output 5 2 2 5 4 1 6 0 HINT Sou…

一步一步学Vue(四)

接上篇。上篇中给出了代码框架&#xff0c;没有具体实现&#xff0c;这一篇会对上篇定义的几个组件进行分别介绍和完善&#xff1a; 1、TodoContainer组件 TodoContainer组件&#xff0c;用来组织其它组件&#xff0c;这是react中推荐的方式&#xff0c;也是redux中高阶组件一般…

【51单片机快速入门指南】4.3: I2C读取MPU6050陀螺仪的原始数据

目录硬知识特性参数MPU6050 简介模块重要寄存器简介电源管理寄存器 1陀螺仪配置寄存器加速度传感器配置寄存器FIFO 使能寄存器陀螺仪采样率分频寄存器配置寄存器电源管理寄存器 2陀螺仪数据输出寄存器加速度传感器数据输出寄存器温度传感器示例程序MPU6050.cMPU6050.hmain.c实验…

OSM数据的获取及格式转换

转自 &#xff1a;http://blog.sina.com.cn/s/blog_72f0b6080102w39z.html 前言&#xff1a;本篇博文将介绍如何对OSM数据进行获取&#xff0c;以及格式的转换&#xff08;转为shapefile格式&#xff09;。以供OSM数据获取失败、OSM editor操作失败的朋友参考。由于并不是多么高…

再读TCP/IP网络7层协议

随着工作的深入&#xff0c;每次读这7层协议&#xff0c;每次都有不同的理解。 分层名 分层号 描述 比喻 应用层Application La…

LVS之一:基本命令和调度方法

实验环境&#xff1a;fedora_server最新版本1.查看内核是否支持ipvsgrep -i vs /boot/config-3.17.4-301.fc21.i686PAE2.安装ipvsadmyum install ipvsadm3.ipvsadm命令1、管理集群服务1.添加&#xff1a;-Aipvsadm -A|E -t|u|f service-address-t&#xff1a;tcp协议集群 -u&am…

windows下安装mysql教程

下载mysql压缩包 我的系统是windows10&#xff0c;64位的&#xff0c;我下载了最新版的MySQL Community Server。这是社区版的mysql服务器。自己根据自己系统酌情下载。 解压和检查包内容 用你喜欢的软件将你下载来的压缩包解压&#xff0c;解压位置随意&#xff0c;因为可以配…

oracle复习笔记

2019独角兽企业重金招聘Python工程师标准>>> 1.oracle相关认证&#xff1a;OCA:Oracle认证专员&#xff0c;OCP:Oracle专家认证&#xff0c;OCM:Oracle认证大师。 2.1979年,Oracle2发布。 3.Oracle数据库特点&#xff1a;支持多用户&#xff0c;大事务量的事务处理&…

依据地图上的经纬度坐标计算某个点到多边形各边的距离

http://www.th2w.com/article/85 依据地图上的经纬度坐标计算某个点到多边形各边的距离 最近公司有一个需求&#xff1a;依据地图上的经纬度坐标计算某个点到多边形各边的距离。 主要原理&#xff1a; 依据当前点p和多边形相邻两点(pb, pe)组成三角形由于是坐标系&#xff0c;…

Redis持久化(转载)

原文地址&#xff1a;http://www.jianshu.com/p/2f14bc570563?fromjiantop.com 数据持久化 Redis提供了将数据定期自动持久化至硬盘的能力&#xff0c;包括RDB和AOF两种方案&#xff0c;两种方案分别有其长处和短板&#xff0c;可以配合起来同时运行&#xff0c;确保数据的稳…

linux内核中send与recv函数详解

Linux send与recv函数详解 1.简介 #include <sys/socket.h> ssize_t recv(int sockfd, void *buff, size_t nbytes, int flags); ssize_t send(int sockfd, const void *buff, size_t nbytes, int flags); send和recv的前3个参数等同于read和write&#xff1b;flags参数值…

【51单片机快速入门指南】4.3.1: MPU6050调用DMP库获取四元数和欧拉角

目录相关介绍DMP库相关DMP加载步骤&#xff1a;DMP设置数据写入更新DMPDMP数据包结构程序实现DMP.cDMP.h测试程序四元数实验现象欧拉角的获取普中51-单核-A2 STC89C52 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 上位机&#xff1a;Vofa 1.3.10 相关…

cardsui-for-android

https://github.com/Androguide/cardsui-for-android cardsui-for-android-master.zip

spoj 2 Prime Generator

题目&#xff1a;Prime Generator 思路&#xff1a;分段筛素数 #include <cstdio> #include <iostream> #include <cmath> #include <algorithm> #include <cstring> #include <map> using namespace std; #define maxn 40000 int n_prime…