您的位置:首页 > 其它

2016暑期集训1B 构造回文字符串

2016-08-10 21:13 267 查看

构造回文字符串

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

题目描述

一个字符串是回文字符串当且仅当这个字符串从左向右读和从右向左读是一样的,比如:aba, cddc。

现在给定一个字符串,问你,最少添加多少个字符,可以使得字符串变成回文字符串。样例中Ab3bd最少添加2个字符串,如Adb3bdA。

输入

第一行输入字符串长度n

第二行输入字符串,仅由字母和数字构成

输出

输出最少添加字符个数

样例输入

5

Ab3bd

样例输出

2

提示

【数据规模和约定】

50%数据 3<=n<=500

100%数据 3<=n<=5000

这是一道比较明显的DP题

f[i,j]表示i到j区间的最小修改次数

若a[i]=a[j] f[i,j]=f[i+1,j-1]

否则 f[i,j]=min(f[i+1,j],f[i,j-1])+1

附上代码

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int n;
char s[5005];
int f[5005][5005];
int main(){
scanf("%d",&n);
scanf("%s",s+1);
for (int i=1;i<=n;i++){
f[i][i]=0;
}
for (int i=1;i<=n-1;i++){
if (s[i]==s[i+1]) f[i][i+1]=0;
else f[i][i+1]=1;
}
for (int len=2;len<=n;len++){
for (int i=1;i<=n-len+1;i++){
int j=i+len-1;
if (s[i]==s[j]) f[i][j]=f[i+1][j-1];
else {
f[i][j]=min(f[i+1][j],f[i][j-1])+1;
}
}
}
printf("%d\n",f[1]
);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  动态规划