标签:
Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 59094 | Accepted: 20528 |
Description
Input
Output
Sample Input
5 Ab3bd
Sample Output
2
Source
/* f[i][j]表示从字符标号i-j 变成回文串需要的最少步数 不难得出 若s[j]==s[i+j] : f[j][i+j]=f[j+1][i+j-1], 否则 : f[j][i+j]=min(f[j+1][i+j],f[j][i+j-1])+1 */ #include<cstdio> #include<iostream> using namespace std; #define N 5010 char s[N];int n; short int f[N][N]; int main(){ scanf("%d%s",&n,s); for(int i=1;i<=n;i++){ f[i][i]=0;f[i][i+1]=s[i]==s[i+1]?0:1;//初始化 } for(int i=1;i<=n;i++){//循环两个字母的间隔 for(int j=0;i+j<n;j++){//循环开端字母 if(s[j]==s[i+j]) f[j][i+j]=f[j+1][i+j-1]; else f[j][i+j]=min(f[j+1][i+j],f[j][i+j-1])+1; } } printf("%d\n",f[0][n-1]); return 0; }
标签:
原文地址:http://www.cnblogs.com/shenben/p/5495528.html