题目大意:
插入最少的字符,使原字符串成为回文串。
题解:
LCS问题,将字符串反转,然后求这俩字符串的LCS,总长度减去LCS即可(多组输入)。
N最大是5E3,直接用二维数组会超内存。所以要用到滚动数组。
code:
#include<bits/stdc++.h> using namespace std; const int N=5E3+7; int dp[2][N]; char s1[N],s2[N]; int main(){ int n; ios::sync_with_stdio(0); while(cin>>n){ memset(dp,0,sizeof dp); cin>>s1+1; for(int i=1;i<=n;i++) s2[i]=s1[i]; reverse(s1+1,s1+1+n); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++){ if(s1[i]==s2[j]) dp[i%2][j]=max(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; }