博客
关于我
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 中的 *tuple 和 **dict 是什么意思?
查看>>
Python 中的 filter() 函数:筛选可迭代对象元素
查看>>
Python 中的 Pillow 不允许我打开图像(“超出限制“)
查看>>
Python 中的 threading 模块和 multiprocessing 模块有何区别?
查看>>
Python 中的 threading 模块和 multiprocessing 模块有何区别?
查看>>
Python 中的 Turtle 库详解
查看>>
Python 中的 __slots__ 属性有什么作用?
查看>>
Python 中的... 三点、箭头(->)、/ 分别的作用
查看>>
python读取json数据的id_python处理JSON数据
查看>>
Python 中的Duck Typing
查看>>
Python 中的for in 遍历生成字典、添加判断条件if
查看>>
Python 中的Lock与RLock
查看>>
Python 中的range(),arange()函数
查看>>
Python 中的内存管理机制
查看>>
Python 中的函数包装器:模型运行时和调试
查看>>
Python 中的列表理解和 lambda
查看>>
Python 中的多层for in嵌套循环使用
查看>>
Python 中的多线程(01/4)
查看>>
Python 中的多进程(01/2):简介
查看>>