题目的意思是给你一个字符串,求插入最少的字符数量使得这个字符串变成回文串。

把原字符串和原字符串的反转字符串求个LCS就可以求出保留的字符串,然后用总的减去即可。注意,因为数据比较多,数组会爆ME,所以要用到滚动数组优化。因为LCS只与当前行与上一行数组有关,所以我们需要保留两行的数组即可。


代码:

StatusAccepted
Time405ms
Memory1772kB
Length665
LangC++
#include <iostream>
#include <cstdio>
#include <memory.h>
using namespace std;
const int maxn=5005;
char str[maxn];
int dp[2][maxn];
inline int max(int a, int b){return a>b?a:b;}
int main()
{
    int n;
    while(~scanf("%d", &n)){
        scanf("%s", &str[1]);
        memset(dp, 0, sizeof(dp));
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(str[i]==str[n-j+1]){
                    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]);
                }
            }
        }
        printf("%d\n", n-dp[n%2][n]);
    }
    return 0;
}