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 }