码迷,mamicode.com
首页 > 其他好文 > 详细

Laoj P1285 回文词(ioi2000)

时间:2017-08-06 00:18:57      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:cin   puts   int   回文   class   lcs   判断   答案   添加   

试题描述
所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"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 }

 

Laoj P1285 回文词(ioi2000)

标签:cin   puts   int   回文   class   lcs   判断   答案   添加   

原文地址:http://www.cnblogs.com/shamman/p/7291957.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!