LQ0125 密码脱落LCS

Posted 海岛Blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LQ0125 密码脱落LCS相关的知识,希望对你有一定的参考价值。

题目来源:蓝桥杯2016初赛 C++ A组G题

题目描述
X星球的考古学家发现了一批古代留下来的密码。这些密码是由A、B、C、D 四种植物的种子串成的序列。
仔细分析发现,这些密码串当初应该是前后对称的(也就是我们说的镜像串)。
由于年代久远,其中许多种子脱落了,因而可能会失去镜像的特征。
你的任务是:给定一个现在看到的密码串,计算一下从当初的状态,它要至少脱落多少个种子,才可能会变成现在的样子。

输入格式
输入存在多组测试数据,对于每组测试数据输入一行,表示现在看到的密码串(长度不大于1000)

输出格式
对于每组测试数据要求输出一个正整数,表示至少脱落了多少个种子。

输入样例
ABCBA
ABDCDCBABC

输出样例
0
3

问题分析
用LCS来解决。

AC的C++语言程序如下:

/* LQ0125 密码脱落 */

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

const int N = 1000;
int dp[N + 1][N + 1];

int lcs(string a, string b)

    memset(dp, 0, sizeof dp);

    int lena = a.length();
    int lenb = b.length();
    for (int i = 0; i < lena; i++)
      for (int j = 0; j < lenb; j++)
        if(a[i] == b[j])
            dp[i + 1][j + 1] = dp[i][j] + 1;
        else
            dp[i + 1][j + 1] = max(dp[i][j + 1], dp[i + 1][j]);

    return dp[lena][lenb];


int main()

    string s;
    while (cin >> s) 
        string t = s;
        reverse(t.begin(), t.end());
        cout << t.length() - lcs(s, t) << endl;
    

    return 0;

以上是关于LQ0125 密码脱落LCS的主要内容,如果未能解决你的问题,请参考以下文章

16年第七届蓝桥杯第九题_密码脱落_(贪心)

密码脱落 (区间DP)

LQ0139 油漆面积枚举

LQ0274 密码发生器水题

LQ0274 密码发生器水题

科学家开发便携式测试工具 可快速检测珊瑚“杀手”棘冠海星