您的位置:首页 > 文旅 > 美景 > 汕头seo网站优化_互联网公司排名2021南方财富网_怎么做互联网推广_专门搜索知乎内容的搜索引擎

汕头seo网站优化_互联网公司排名2021南方财富网_怎么做互联网推广_专门搜索知乎内容的搜索引擎

2025/7/1 23:39:28 来源:https://blog.csdn.net/2301_81170529/article/details/146985263  浏览:    关键词:汕头seo网站优化_互联网公司排名2021南方财富网_怎么做互联网推广_专门搜索知乎内容的搜索引擎
汕头seo网站优化_互联网公司排名2021南方财富网_怎么做互联网推广_专门搜索知乎内容的搜索引擎

最长上升子序列

题目传送门

一、题目描述

给定一个长度为 N 的数列,求数值严格单调递增的子序列的长度最长是多少。

输入格式
第一行包含整数 N
第二行包含 N 个整数,表示完整序列。

输出格式
输出一个整数,表示最大长度。

数据范围
1 ≤ N ≤ 1000,
−10⁹ ≤ 数列中的数 ≤ 10⁹

输入样例

7
3 1 2 1 8 5 6

输出样例

4

二、题目分析

我们需要找到一个序列中最长的严格递增的子序列的长度。子序列不要求连续,但必须保持原序列中的相对顺序。

三、问题思考

算法分析
这是一个经典的动态规划问题。我们需要找到以每个元素结尾的最长上升子序列的长度,然后取所有可能中的最大值。

前置知识

  • 动态规划基本概念
  • 数组遍历和状态转移

四、动态规划思路

a. 状态表示

  • 定义 f[i] 表示以第 i 个元素结尾的最长上升子序列的长度。

b. 初始化

  • 每个元素本身就是一个长度为1的子序列,所以初始时 f[i] = 1

c. 状态转移

  • 对于每个 i,我们检查所有 j < i 的元素:
    • 如果 a[i] > a[j],说明 a[i] 可以接在 a[j] 后面,形成更长的子序列。
    • 因此,f[i] = max(f[i], f[j] + 1)

d. 最终结果

  • 最终结果是所有 f[i] 中的最大值。

五、代码实现

#include <bits/stdc++.h>using namespace std;
const int N = 1010;int n;
int a[N], f[N];
int res;int main() {cin >> n;for (int i = 1; i <= n; i++) cin >> a[i];for (int i = 1; i <= n; i++) {f[i] = 1; // 初始化为1,因为每个元素本身就是一个子序列for (int j = 1; j < i; j++)if (a[i] > a[j]) f[i] = max(f[i], f[j] + 1); // 状态转移res = max(res, f[i]); // 更新最大值}printf("%d", res);return 0;
}

六、重点细节

  1. 初始化:每个 f[i] 初始化为1,因为每个元素本身就是一个长度为1的子序列。
  2. 状态转移:内层循环遍历所有 j < i 的元素,如果 a[i] > a[j],则更新 f[i]
  3. 结果更新:每次计算完 f[i] 后,立即更新全局最大值 res

七、复杂度分析

  • 时间复杂度:O(N²),因为有两层嵌套循环,外层循环 N 次,内层循环最多 N 次。
  • 空间复杂度:O(N),用于存储数组 af

八、总结

本题是一个经典的动态规划问题,通过定义状态 f[i] 表示以第 i 个元素结尾的最长上升子序列的长度,然后通过状态转移逐步求解。最终结果是所有 f[i] 中的最大值。这种方法直观且易于理解,适合初学者掌握动态规划的基本思想。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com