蓝桥杯 3. 密码脱落
密码脱落
原题目链接
题目描述
X 星球的考古学家发现了一批古代留下来的密码。
这些密码是由 A
、B
、C
、D
四种植物的种子串成的序列。
仔细分析发现,这些密码串当初应该是前后对称的(即镜像串)。
由于年代久远,其中许多种子脱落了,因此有些串可能失去了镜像的特征。
你的任务是:
- 给定一个现在看到的密码串,
- 计算出至少脱落多少个种子,才能使得当初的串变成现在的样子。
输入描述
- 输入一行,表示现在看到的密码串(字符串长度不超过 1000)。
输出描述
- 输出一个正整数,表示至少脱落了多少个种子。
输入输出样例
示例 1
输入
ABCBA
输出
0
示例 2
输入
ABDCDCBABC
输出
3
(说明:脱落越少,保持镜像结构越好,求最少脱落的数量。)
c++代码
#include<bits/stdc++.h>using namespace std;string a, b;
int n;int main() {cin >> a;b = a, reverse(a.begin(), a.end());n = a.size();vector<int> last(n + 1), now(n + 1);for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {now[j] = a[i - 1] == b[j - 1] ? last[j - 1] + 1 : max(last[j], now[j - 1]);}last = now;}cout << n - last[n];return 0;
}//by wqs
算法解析
其实就是最长公共子序列问题
求出s和它的反转sr的最长公共子序列,它是一个回文串
需要添加的字符个数就是长度减去这个子序列的长度
用求最长公共子序列的常规方法-动态规划来解