博客
关于我
POJ 3670 DP LIS?
阅读量:793 次
发布时间:2023-03-03

本文共 1505 字,大约阅读时间需要 5 分钟。

最长上升和最长下降序列的分解问题

问题描述

我们需要解决一个经典的动态规划问题:给定一个长度为n的序列a,找出最长的上升序列和最长的下降序列。这里的上升序列和下降序列都定义为相邻元素的差值满足非负(上升)或非正(下降)的条件。

算法思路

为了高效地解决这个问题,我们可以使用动态规划的方法来分别计算最长上升序列和最长下降序列。具体来说,我们可以定义两个数组:

  • f[i][j] 表示前i个元素以j结尾的最长上升序列的长度。
  • g[i][j] 表示前i个元素以j结尾的最长下降序列的长度。

上升序列的动态规划

对于每个位置i,我们从j=1到3遍历可能的结尾值。对于每个j,我们检查k从1到j的可能值,更新f[i][j]为f[i-1][k]加上当前元素与j的比较结果(如果当前元素不等于j,则加1)。

下降序列的动态规划

同样地,我们定义g[i][j]来表示最长下降序列。与上升序列类似,我们遍历k从j到3的值,更新g[i][j]为g[i-1][k]加上当前元素与j的比较结果。

代码实现

#include 
#include
#include
using namespace std;
int main() {
int n;
int a[33333];
int f[33333][4], g[33333][4];
int ans = 0x3fffff;
scanf("%d", &n);
for (int i = 1; i <= n; ++i) {
scanf("%d", &a[i]);
}
memset(f, 0x3f, sizeof(f));
memset(g, 0x3f, sizeof(g));
for (int i = 1; i <= 3; ++i) {
f[0][i] = g[0][i] = 0;
}
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= 3; ++j) {
for (int k = 1; k <= j; ++k) {
f[i][j] = min(f[i][j], f[i-1][k] + (a[i] != j));
}
}
for (int j = 1; j <= 3; ++j) {
for (int k = j; k <= 3; ++k) {
g[i][j] = min(g[i][j], g[i-1][k] + (a[i] != j));
}
}
}
ans = min(ans, min(f[n][1], f[n][2], f[n][3]));
ans = min(ans, min(g[n][1], g[n][2], g[n][3]));
printf("%d\n", ans);
}

结果计算

最后,我们从所有可能的上升和下降序列中选择最短的那个作为答案,因为这个值对应的长度就是我们想要的最长序列的长度。

总结

通过上述动态规划方法,我们可以高效地计算出给定序列的最长上升和下降序列。代码通过逐步遍历每个位置和可能的值,确保了在合理的时间复杂度内解决问题。

转载地址:http://zbxfk.baihongyu.com/

你可能感兴趣的文章
php时间戳知识点,php 时间戳函数总结与示例
查看>>
php更新数据库失败,php – 无法更新MySQL数据库
查看>>
php机器人聊天对话框,基于AIML的PHP聊天机器人
查看>>
PHP查找数组中最大值与最小值
查看>>
php查最大值,在PHP数组中查找最大值
查看>>
php标签筛选,关于PHP CodeIgniter框架中通过<a>标签和url做多条件分类筛选
查看>>
php根据年月日计算年龄
查看>>
RabbitMQ - 单机部署(超详细)
查看>>
php检查注册,PHP检查注册的电子邮件地址是一个’school.edu’地址
查看>>
php模拟发送GET和POST请求
查看>>
RabbitMQ - 以 MQ 为例,手写一个 RPC 框架 demo
查看>>
php模板引擎smarty
查看>>
php正则表达式模式
查看>>
php正则表达式的特殊字符含义
查看>>
PHP正则表达式获取武汉市的实时pm2.5数据并邮件发送phpmailer
查看>>
RabbitMQ + JMeter组合,优化你的中间件处理方式!
查看>>
PHP水仙花问题解法之一
查看>>
php没有解析是怎么回事,linux下php文件没有被剖析怎么办?_后端开发
查看>>
php注册页面实现注册后跳转页面
查看>>
PHP消息队列的实现方式与详解,值得一看
查看>>