标签:
Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 54621 | Accepted: 18892 |
Description
Input
Output
Sample Input
5 Ab3bd
Sample Output
2
题意:求给定字符串中插入最少字符使之成为回文,求插入最少字符个数
思路:所谓回文,就是逆转后还等于原串,因此原串和逆串的lcs剩下的位置即是必须插入的位置,因此本题只需逆转后求lcs,再用n-lcs即可
dp开二维数组居然MLE了,后来改成short int就AC了,不过又改成滚动数组AC了,滚动数组还是很方便的
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> using namespace std; const int maxn=5010; const int INF=(1<<28); int n; char s[maxn],t[maxn]; int dp[2][maxn]; int main() { while(scanf("%d",&n)!=EOF){ for(int i=1;i<=n;i++){ cin>>s[i]; t[n-i+1]=s[i]; } memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++){ /// lcs for(int j=1;j<=n;j++){ if(s[i]==t[j]) dp[i%2][j]=dp[(i-1)%2][j-1]+1; else dp[i%2][j]=max(dp[(i-1)%2][j],dp[i%2][j-1]); } } cout<<n-dp[n%2][n]<<endl; } return 0; }
标签:
原文地址:http://www.cnblogs.com/--560/p/4355038.html