插入最少字符使原串变成回文串

51nod1092 回文字符串
解法一:
这里插入字符和删除对应字符是一个道理,所以将原串逆序之后求一遍LCS即可:

#include
using namespace std;
const int maxn=1000;
char a[maxn+10];
char b[maxn+10];
int sum[maxn+10][maxn+10];

int main(){
    scanf("%s",a+1);
    int n=strlen(a+1);
    for(int i=1;i<=n;i++){
        b[i]=a[n-i+1];
    }
    memset(sum,0,sizeof(sum));

    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(a[i]==b[j])sum[i][j]=sum[i-1][j-1]+1;
            else sum[i][j]=max(sum[i-1][j],sum[i][j-1]);
        }
    }
    cout<

解法二:
从串的两边考虑,设d(i,j)表示在串s(i,j)中最少插入字符个数
这里写图片描述
这里有大量重复子问题,所以要用记忆化搜索

#include
using namespace std;
const int maxn=1000;
char s[maxn+10];
int d[maxn+10][maxn+10];

int dp(int i,int j){
    if(i>=j)return 0;
    int &ans=d[i][j];
    if(ans>=0)return ans;
    if(s[i]==s[j])return ans=dp(i+1,j-1);
    return ans=min(dp(i+1,j),dp(i,j-1))+1;
}

int main(){
    memset(d,-1,sizeof(d));
    scanf("%s",s+1);
    int n=strlen(s+1);
    cout<1,n);
}

你可能感兴趣的:(动态规划)