博客
关于我
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 条件运算符解决方法如何工作?
查看>>
python 枚举类型
查看>>
Python 查询 Mongodb数据库
查看>>
python 查询Neo4j多节点的多层关系
查看>>
Python多处理导致许多僵尸进程
查看>>
Python多处理对象引用
查看>>
Python多处理安全地写入文件
查看>>
python多处理参数:深拷贝?
查看>>
Python多处理使用队列写入同一个文件
查看>>
Python多处理.Process:从局部变量开始
查看>>
Python多处理-进程数
查看>>
python多个定时器_python单线程实现多个定时器示例
查看>>
python处理文本_Python - Tokenization
查看>>
Python处理数据方向之OpenCV
查看>>
python处理一亿条数据_Python数据分析实战(一)
查看>>
Python处理PDF神器:PyMuPDF的安装与使用
查看>>
Python处理Excel数据
查看>>
Python基础:集合与文件操作
查看>>
Python基础:搭建开发环境(1)
查看>>
PYTHON基础:如何阅读N个整数,直到#39;
查看>>