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

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

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

问题描述

我们需要解决一个经典的动态规划问题:给定一个长度为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/

你可能感兴趣的文章
Python 操作 JMeter 探索:pymeter 实操指南
查看>>
Python 操作 Redis
查看>>
Python 操作Mysql(PyMysql)
查看>>
Python 操作Redis
查看>>
Python 操作sqlite数据库及保存查询numpy类型数据(一)
查看>>
Python 操作sqlite数据库及保存查询numpy类型数据(二)
查看>>
Python 操作数据库
查看>>
Python 数据分析与可视化实战
查看>>
python 数据可视化 -- matplotlib02
查看>>
python 数据可视化利器
查看>>
Python 数据可视化详解
查看>>
python 数据库查询返回list或tuple
查看>>
Python 数据库连接池管理的基本知识 (附Demo)
查看>>
Python学习记录-2016-12-17
查看>>
Python 数据库骚操作 -- MySQL
查看>>
Python 数据操作详解
查看>>
Python 数据文件与网络数据序列化存储详解
查看>>
Python 数据结构与算法详解
查看>>
Python 数据采集、清洗、整理、分析以及可视化实战
查看>>
Python 数据预处理
查看>>