zoukankan      html  css  js  c++  java
  • 回文词

    题目描述

    回文词是一种对称的字符串——也就是说,一个回文词,从左到右读和从右到 左读得到的结果是一样的。任意给定一个字符串,通过插入若干字符,都可以变成一个回文 词。你的任务是写一个程序,求出将给定字符串变成回文词所需插入的最少字符数。 比如字符串“Ab3bd”,在插入两个字符后可以变成一个回文词(“dAb3bAd” “Adb3bdA”)。然而,插入两个以下的字符无法使它变成一个回文词。

    输入格式

    文件的第一行包含一个整数(N),表示给定字符串的长度((3≤N≤5000))

    文件的第二行是一个长度为N的字符串。字符串仅由大写字母“A”到“Z”,小写字母“a” 到“z”和数字“0”到“9”构成。大写字母和小写字母将被认为是不同的。

    输出格式

    文件只有一行,包含一个整数,表示需要插入的最少字符数。

    样例

    样例输入

    5
    Ab3bd 
    

    样例输出

    2 
    

    题解

    解题思路

    回文词正着和倒过来是一样的

    我们把这列字符倒过来,求最长公共子序列

    用总长度减去这个结果,就是不同的个数,也就是需要插入的字符数

    然后就是板子问题了

    代码

    #include <cstdio>
    #include <algorithm>
    using namespace std;
    const int N = 5e3+5;
    int n, f[N][N];
    char a[N], b[N];
    int main() {
        scanf("%d %s", &n, a+1);
        for(int i = 1; i <= n; i++) b[n-i+1] = a[i];
        for(int i = 1; i <= n; i++)
            for(int j = 1; j <= n; j++)
                if (a[i] == b[j]) f[i][j] = f[i-1][j-1] + 1;
                else f[i][j] = max(f[i-1][j], f[i][j-1]);
        printf("%d
    ", n - f[n][n]);
        return 0; 
    }
    
  • 相关阅读:
    tar命令,vi编辑器
    Linux命令、权限
    Color Transfer between Images code实现
    利用Eclipse使用Java OpenCV(Using OpenCV Java with Eclipse)
    Matrix Factorization SVD 矩阵分解
    ZOJ Problem Set
    Machine Learning
    ZOJ Problem Set
    ZOJ Problem Set
    ZOJ Problem Set
  • 原文地址:https://www.cnblogs.com/Z8875/p/13178999.html
Copyright © 2011-2022 走看看