W

题目大意:

插入最少的字符,使原字符串成为回文串。

题解:

  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;
}
原文地址:https://www.cnblogs.com/Accepting/p/12526660.html