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

【动态规划】回文字符串

时间:2016-08-01 19:34:34      阅读:225      评论:0      收藏:0      [点我收藏+]

标签:

【动态规划】回文字符串

时间限制: 1 Sec  内存限制: 128 MB

题目描述

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

输入

第一行给出整数N(0<N<100)
接下来的N行,每行一个字符串,每个字符串长度不超过1000.

输出

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

样例输入

1
Ab3bd

样例输出

2

分析:求插入最少的字符使字符串变为回文字符串就是求输入字符串中的最大回文数长度然后用总长减去最大长度就是所求字符数
dp[i][j]表示从输入字符串的第i个位置到第j个位置的最大长度
if(c[i-1]==c[j-1])  dp[i][j]=dp[i-1][j-1]+1
else  dp[i][j]=max(dp[i-1][j],dp[i][j-1]


 1 #include <iostream>
 2 #include <cstring>
 3 #include <algorithm>
 4 
 5 using namespace std;
 6 
 7 int n;
 8 char c[1111],d[1111];
 9 int dp[1111][1111];
10 
11 int main()
12 {
13     while(cin>>n)
14     {
15         while(n--)
16         {
17             cin>>c;
18             int len=strlen(c);
19             memset(dp,0,sizeof(dp));
20             for(int i=0,j=len-1;i<len;i++,j--)
21                 d[j]=c[i];
22 
23             for(int i=1;i<=len;i++)                 //dp[i][j]需要从0开始
24             {
25                 for(int j=1;j<=len;j++)             
26                 {
27                     if(c[i-1]==d[j-1])              //c[i-1]  d[j-1]从0到len-1
28                         dp[i][j]=dp[i-1][j-1]+1;
29                     else
30                         dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
31                 }
32             }
33             cout<<len-dp[len][len]<<endl;
34         }
35     }
36     return 0;
37 }

 

 

【动态规划】回文字符串

标签:

原文地址:http://www.cnblogs.com/asuml/p/5726769.html

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