题目链接:51Nod

思路:处理回文的东西许多时候要考虑反转一下与原串相比。对于本题,发现一个结论:原串与逆序串的LCS扣除后剩下的串长度恰好是我们要构造对称的最少长度,因为这样找LCS相当于回文串中找后面的一个匹配,当然LCS是不连续的,而回文要求连续,这样扣除一下恰好会是一个连续的结果。
#include <bits/stdc++.h>
using namespace std;
int dp[1005][1005], len1, len2;
string str1, str2;
int main() {
cin >> str1;
str2 = str1;
len1 = len2 = str1.size();
reverse(str2.begin(), str2.begin());
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= len1; i++)
for (int j = 1; j <= len2; j++)
if (str1[i-1] == str2[j-1])
dp[i][j] = dp[i-1][j-1]+1;
else
dp[i-1][j-1] = max(dp[i-1][j], dp[i][j-1]);
cout << len1-dp[len1][len2] << endl;
return 0;
}

本文介绍了一种使用最长公共子序列(LCS)算法来确定构造对称字符串所需最短长度的方法。通过对比原串及其逆序串的LCS,得出剩余部分即为待构造的对称串长度。代码实现采用C++,并展示了如何计算两个字符串的LCS。
4653

被折叠的 条评论
为什么被折叠?



