
蓝桥 区间dp
问题分析:给定一个由A、B、C、D四种种子组成的密码串,我们需要找到至少脱落多少个种子才能使其变成现在的状态。这个问题可以转化为寻找最长对称子序列的问题。 动态规划:我们可以使用动态规划来解决这个问题。定义一个二维数组 状态转移: 结果计算:最长对称子序列的长度减去原串长度,即为脱落的种子数。 输入处理:读取输入字符串并获取其长度。 初始化:创建一个二维数组 填充dp数组:从长度2开始,逐步增加,计算每个子串的最长对称子序列长度。 计算结果:最长对称子序列的长度减去原串长度,得到至少脱落的种子数。
发布日期:2021-05-14 16:48:37
浏览次数:16
分类:精选文章
本文共 1216 字,大约阅读时间需要 4 分钟。
为了解决这个问题,我们需要计算从对称状态变成现在状态所至少脱落的种子数。我们可以通过动态规划的方法来找到最长对称子序列,然后计算脱落的种子数。
方法思路
dp[i][j]
,表示从位置i到j的子串的最长对称子序列的长度。- 如果s[i] == s[j],那么最长对称子序列的长度是
dp[i+1][j-1] + 2
。 - 如果s[i] != s[j],那么最长对称子序列的长度是
max(dp[i][j-1], dp[i+1][j])
。
解决代码
#include#include using namespace std;int main() { string s; int n; scanf("%s", s.c_str()); n = s.size(); if (n == 0) { return 0; } int dp[n][n]; for (int i = 0; i < n; ++i) { dp[i][i] = 1; } for (int l = 2; l <= n; ++l) { for (int i = 0; i <= n - l; ++i) { int j = i + l - 1; if (s[i] == s[j]) { dp[i][j] = 2 + dp[i + 1][j - 1]; } else { dp[i][j] = max(dp[i][j - 1], dp[i + 1][j]); } } } int max_len = dp[0][n-1]; int result = n - max_len; cout << result << endl; return 0;}
代码解释
dp
,其中dp[i][i]
初始化为1,因为一个单独的字符本身就是最长对称子序列。通过这种方法,我们可以高效地解决问题,并确保结果的正确性。
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2025年04月22日 14时58分18秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
ObjectInputStream、ObjectOutputStream
2019-03-11
JVM内存模型
2019-03-11
反射机制
2019-03-11
反射Field、Method、Constructor
2019-03-11
可变长度参数
2019-03-11
堆空间常用参数总结
2019-03-11
逃逸分析-堆分配对象
2019-03-11
常量池、运行时常量池
2019-03-11
3、条件查询
2019-03-11
5、分组函数 / 聚合函数
2019-03-11
8、子查询
2019-03-11
cordova打包apk更改图标
2019-03-11
开启与配置SMTP服务器
2019-03-11
APP卡片式设计
2019-03-11
GitHub上传时,项目在已有文档时直接push出现错误解决方案
2019-03-11
云数据库
2019-03-11
大数据在不同领域的应用
2019-03-11
页面置换算法
2019-03-11
推荐系统资料
2019-03-11
文件系统的层次结构
2019-03-11