Laoj P1285 回文词(ioi2000)


试题描述

所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba"。当然,我们给你的问题不会再简单到判断一个字符串是不是回文字符串。现在
要求你,给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串。

输入格式

一个字符串,长度不超过1000.

输出格式

每行输出所需添加的最少字符数

输入示例

Ab3bd


输出示例

2

【分析】

s2是与s1相反的字符串,只要求出s1与s2的lcs,再拿总长度减去这个值即是答案。

我之前推出来的ans=min{len-2*dp[i][n-i-1]-1, len-2*dp[i][n-i]}不知道为什么打死只能80..

【代码】

 1 #include <iostream>
 2 #include <cstring>
 3 #include <string>
 4 #include <algorithm>
 5 using namespace std;
 6
 7 string s1, s2;
 8
 9 int dp[1001][1001], len, ans=0x7fffffff;
10
11 int main() {
12     cin >> s1;
13     int len=s1.length();
14     s2=s1;
15     s1=" "+s1;
16     s2=" "+s2;
17     for (int i=1;i<=len;++i)
18         s2[len-i+1]=s1[i];
19     for (int i=1;i<=len;++i)
20         for (int j=1;j<=len;++j)
21             if (s1[i]==s2[j])
22                 dp[i][j]=max(dp[i][j], dp[i-1][j-1]+1);
23             else
24                 dp[i][j]=max(dp[i][j-1], dp[i-1][j]);
25     for (int i=2;i<len;++i)
26         ans=min(ans, len-2*dp[i][len-i-1]-1);
27     cout << ans << endl;
28 }
时间: 2024-09-29 23:28:30

Laoj P1285 回文词(ioi2000)的相关文章

Vijos1327回文词

回文词 回文词是一种对称的字符串--也就是说,一个回文词,从左到右读和从右到左读得到的 结果是一样的.任意给定一个字符串,通过插入若干字符,都可以变成一个回文词.你的任务是写 一个程序,求出将给定字符串变成回文词所需插入的最少字符数. 比如字符串"Ab3bd",在插入两个字符后可以变成一个回文词("dAb3bAd"或"Adb3bdA"). 然而,插入两个以下的字符无法使它变成一个回文词. 输入格式: 文件的第一行包含一个整数N,表示给定的字符串的

csuoj 1328: 近似回文词

http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1328 1328: 近似回文词 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 355  Solved: 138 [Submit][Status][Web Board] Description 输入一行文本,输出最长近似回文词连续子串.所谓近似回文词是指满足以下条件的字符串: 1. S以字母开头,字母结尾 2. a(S)和b(S)最多有2k个位置不同

csu-1328 近似回文词 和 最长回文字符串

原博文地址:http://blog.csdn.net/u012773338/article/details/39857997 最长回文子串 描述:输入一个字符串,求出其中最长的回文子串.子串的含义是:在原串连续出现的字符 串片段.回文的含义是:正着看和倒着看是相同的,如abba和abbebba.在判断是要求忽略所有的标点和空格,且忽略大小写,但输出时按原样输出(首 尾不要输出多余的字符串).输入字符串长度大于等于1小于等于5000,且单独占一行(如果有多组答案,输出第一组). 输入 :每行有一个

UVA 401 Palindromes(回文词)

 回文词 Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Practice UVA 401 Appoint description:  acmparand  (2013-07-07)Luke  (2014-01-20) System Crawler  (2015-05-10) Description A regular palindrome is a string of

csu 1328: 近似回文词

1328: 近似回文词 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 394  Solved: 144 [Submit][Status][Web Board] Description 输入一行文本,输出最长近似回文词连续子串.所谓近似回文词是指满足以下条件的字符串: 1. S以字母开头,字母结尾 2. a(S)和b(S)最多有2k个位置不同,其中a(S)是S删除所有非字母字符并且把所有字母转化成小写之后得到的串,b(S)是a(S)的逆序串. 比如

字符串 - 近似回文词 --- csu 1328

近似回文词 Problem's Link:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1328 Mean: 略. analyse: 直接暴力枚举每一个终点,然后枚举回文串的半径即可. Time complexity:O(n*m) Source code: // Memory Time // 1347K 0MS // by : Snarl_jsb // 2014-10-03-14.25 #include<algorithm> #include

UVa401 回文词

Palindromes A regular palindrome is a string of numbers or letters that is the same forward as backward. For example, the string "ABCDEDCBA" is a palindrome because it is the same when the string is read from left to right as when the string is

回文词

#include <iostream> #include <stdio.h> #include <iomanip> #include <string> using namespace std; const char *rev = "A 3 HIL JM O 2TUVWXY51SE Z 8 ";//字符A-9的镜像字符,没有镜像则为空格 const char * msg[] = {"not a palindrome",&

【Vijos 1327】回文词(DP)

题目描述 回文词是一种对称的字符串——也就是说,一个回文词,从左到右读和从右到左读得到的结果是一样的.任意给定一个字符串,通过插入若干字符,都可以变成一个回文词.你的任务是写一个程序,求出将给定字符串变成回文词所需插入的最少字符数.   比如字符串“Ab3bd”,在插入两个字符后可以变成一个回文词(“dAb3bAd”或“Adb3bdA”).然而,插入两个以下的字符无法使它变成一个回文词. 输入 第一行包含一个整数N,表示给定字符串的长度,3<=N<=5000   第二行是一个长度为N的字符串,