标签:
Description
Input
Output
Sample Input
5 Ab3bd
Sample Output
2
【题意】给出一个字符串,求插入多少字符才能形成回文串;
【思路】用a数组存储原串,b数组储存倒串,求最长公共子序列,答案用n-最长公共子序列;
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; const int N=5050; char a[N],b[N]; //int dp[N][N];//MLE int dp[2][N];//用滚动数组 int main() { int n; while(~scanf("%d",&n)) { getchar(); scanf("%s",a+1); for(int i=1;i<=n;i++) { b[n-i+1]=a[i]; } memset(dp,0,sizeof(dp)); int mx=0; /*for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(a[i]!=b[j]) { dp[i][j]=max(dp[i-1][j],dp[i][j-1]); } else dp[i][j]=dp[i-1][j-1]+1; } }*/ int e=0;//用滚动数组,节约存储空间!!!! for(int i=1;i<=n;i++) { e=1-e; for(int j=1;j<=n;j++) { if(a[i]==b[j]) { dp[e][j]=dp[1-e][j-1]+1; } else { if(dp[1-e][j]>dp[e][j-1]) { dp[e][j]=dp[1-e][j]; } else dp[e][j]=dp[e][j-1]; } } } for(int i=1;i<=n;i++) { mx=max(mx,max(dp[1-e][i],dp[e][i])); } int ans=n-mx; printf("%d\n",ans); } return 0; }
标签:
原文地址:http://www.cnblogs.com/iwantstrong/p/5877324.html