zoukankan      html  css  js  c++  java
  • 回文词——线性DP

    题目描述

    回文词是一种对称的字符串——也就是说,一个回文词,从左到右读和从右到 左读得到的结果是一样的。任意给定一个字符串,通过插入若干字符,都可以变成一个回文 词。你的任务是写一个程序,求出将给定字符串变成回文词所需插入的最少字符数。 比如字符串“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; 
    }
    
  • 相关阅读:
    MongoDB 释放磁盘空间 db.runCommand({repairDatabase: 1 })
    RK 调试笔记
    RK Android7.1 拨号
    RK Android7.1 移植gt9271 TP偏移
    RK Android7.1 定制化 itvbox 盒子Launcher
    RK Android7.1 双屏显示旋转方向
    RK Android7.1 设置 内存条作假
    RK Android7.1 设置 蓝牙 已断开连接
    RK Android7.1 进入Camera2 亮度会增加
    RK 3128 调触摸屏 TP GT9XX
  • 原文地址:https://www.cnblogs.com/shawk/p/13178999.html
Copyright © 2011-2022 走看看