asuml

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

【动态规划】回文字符串

时间限制: 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 }

 

 
posted on 2016-08-01 18:05  asuml  阅读(368)  评论(0编辑  收藏  举报