16级C程序设计竞赛C题

问题 C: 回文
时间限制: 1 Sec  内存限制: 128 MB
提交: 74  解决: 36
[提交][状态][讨论版]
题目描述

        给定一个字符串,你可以对字符串做任意改动,你可以在任意地方增加一个字符、删除一个字符或者改变一个字符。但是不同的操作所花费的代价也是不同的,增加和删除所付出的代价为1,直接改变一个字符所花费的代价为2,问最少花费多少能得到一个回文串(回文串就是从左往右读和从右往左是一样的,例如:ABCBA、HIH…)

输入

       第一行 一个整数T表示接下来有T组数据

       接下来T行 每行输入一个字符串S(S长度小于1000)

输出

 输出满足题意的最小代价

样例输入
3
CHINESE
MNBN
JXUST
样例输出
4
1
4

 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<algorithm>
 4 #include<string>
 5 #include<string.h>
 6 using namespace std;
 7 string a,s;
 8 int dp[1050][1050];
 9 int main(){
10     int T;
11     cin>>T;
12     while(T--){
13         memset(dp,0,sizeof(dp));
14         cin>>a;
15         int alen=a.length();
16         s=a;
17         reverse(s.begin(),s.end());
18         for(int i=1;i<=alen;i++){
19             for(int j=1;j<=alen;j++){
20                 if(a[i-1]==s[j-1]){
21                     dp[i][j]=dp[i-1][j-1]+1;
22                 }else{
23                     dp[i][j]=max(dp[i][j-1],dp[i-1][j]);
24                 }
25             }
26         }
27         cout<<alen-dp[alen][alen]<<endl;
28     }
29     return 0;
30 }




原文地址:https://www.cnblogs.com/ISGuXing/p/7673919.html