博客
关于我
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编程读取写入excel_Python读取txt内容写入xls格式excel中的方法
查看>>
Python 基础语法:基本数据类型(字典)
查看>>
Python 基础语法:基本数据类型(字符串)
查看>>
Python 基础语法:基本数据类型(集合)
查看>>
Python编程的终极十大工具
查看>>
python 堆排序
查看>>
python编程方式之一-函数式编程
查看>>
python 复习计划
查看>>
Python 多处理 apply_async 永远不会在 Windows 7 上返回结果
查看>>
Python 多处理 Numpy 随机
查看>>
Python 多处理 >= 125 列表永远不会完成
查看>>
Python 多处理:在第一个子错误时中止映射
查看>>
Python 多处理不断产生 pythonw.exe 进程而不做任何实际工作
查看>>
Python 多处理从不加入
查看>>
Python 多处理如何优雅地退出?
查看>>
Python 多处理将子进程的标准输出重定向到 Tkinter 文本
查看>>
Python 多处理库错误(AttributeError:__exit__)
查看>>
Python 多处理模块的 .join() 方法到底在做什么?
查看>>
python 多线程与GIL
查看>>