我是靠谱客的博主 幸福小丸子,最近开发中收集的这篇文章主要介绍密码脱落(区间DP)[第七届蓝桥杯省赛C++A/C组,第七届蓝桥杯省赛JAVAC组]题目如下:题解 or 思路:AC 代码如下:,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
题目如下:
X X X 星球的考古学家发现了一批古代留下来的密码。
这些密码是由 A 、 B 、 C 、 D A、B、C、D A、B、C、D 四种植物的种子串成的序列。
仔细分析发现,这些密码串当初应该是前后对称的(也就是我们说的镜像串)。
由于年代久远,其中许多种子脱落了,因而可能会失去镜像的特征。
你的任务是:
给定一个现在看到的密码串,计算一下从当初的状态,它要至少脱落多少个种子,才可能会变成现在的样子。
输入格式
共一行,包含一个由大写字母 A B C D ABCD ABCD 构成的字符串,表示现在看到的密码串。
输出格式
输出一个整数,表示至少脱落了多少个种子。
数据范围
输入字符串长度不超过 1000 1000 1000
输入样例1:
ABCBA
输出样例1:
0
输入样例2:
ABDCDCBABC
输出样例2:
3
题解 or 思路:
经典区间dp问题
将问题转化成:
l
e
n
len
len -
l
l
l 到
r
r
r 最长回文串的长度
状态定义:
d p [ l ] [ r ] dp[l][r] dp[l][r] 在 l l l 到 r r r 区间 最长回文串的长度
状态转移:
- 取
l
l
l &
r
r
r
如果 s t r [ l ] = s t r [ r ] str[l] = str[r] str[l]=str[r]
d p [ l ] [ r ] = d p [ l + 1 ] [ r − 1 ] + 2 dp[l][r] = dp[l + 1][r - 1] + 2 dp[l][r]=dp[l+1][r−1]+2 - 不取
l
l
l
d p [ l ] [ r ] = m a x ( d p [ l ] [ r ] , d p [ l + 1 ] [ r ] ) dp[l][r] = max(dp[l][r], dp[l + 1][r]) dp[l][r]=max(dp[l][r],dp[l+1][r]) - 不取
r
r
r
d p [ l ] [ r ] = m a x ( d p [ l ] [ r ] , d p [ l ] [ r − 1 ] ) dp[l][r] = max(dp[l][r], dp[l][r - 1]) dp[l][r]=max(dp[l][r],dp[l][r−1])
AC 代码如下:
const int N = 1009;
char s[N];
int dp[N][N];
void solve()
{
cin >> s + 1;
int len = strlen(s + 1);
for (int i = 1; i <= len; i++)
for (int j = 1; j + i - 1 <= len; j++)
{
int l = j, r = j + i - 1;
if (l == r)
dp[l][r] = 1;
else
{
if (s[l] == s[r])
dp[l][r] = dp[l + 1][r - 1] + 2;
dp[l][r] = max(dp[l][r], dp[l + 1][r]);
dp[l][r] = max(dp[l][r], dp[l][r - 1]);
}
}
cout << len - dp[1][len] << 'n';
}
int main()
{
solve();
}
最后
以上就是幸福小丸子为你收集整理的密码脱落(区间DP)[第七届蓝桥杯省赛C++A/C组,第七届蓝桥杯省赛JAVAC组]题目如下:题解 or 思路:AC 代码如下:的全部内容,希望文章能够帮你解决密码脱落(区间DP)[第七届蓝桥杯省赛C++A/C组,第七届蓝桥杯省赛JAVAC组]题目如下:题解 or 思路:AC 代码如下:所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复