• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
香草味羊扒饭
博客园    首页    新随笔    联系   管理    订阅  订阅
Acwing 895.最长上升子序列

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

输入格式

第一行包含整数N。

第二行包含N个整数,表示完整序列。

输出格式

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

数据范围

1≤N≤10001≤N≤1000,
−109≤数列中的数≤109−109≤数列中的数≤109

输入样例:

7
3 1 2 1 8 5 6

输出样例:

4


思路:
根据动态转移方程,取每次循环遍历的后最后一个a[i]结尾的单调上升的序列的最大值,最后对每一类的最大值在进行Max
时间复杂度:O(n^2)
 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 const int N = 1e5;
 5 int n;
 6 int a[N];
 7 int f[N];
 8 int main(){
 9   scanf("%d",&n);
10   for(int i = 1;i <= n;i++) scanf("%d",&a[i]);
11   for(int i = 1;i <= n;i++){
12     f[i] = 1;
13     for(int j = 1;j < i;j++)
      //动态转移方程
14 if(a[i] > a[j]) f[i] = max(f[i],f[j] + 1); 15 } 16 17 int res = 0; 18 for(int i = 1;i <= n;i++) res = max(res,f[i]); 19 printf("%d",res); 20 } 21

 

posted on 2019-09-28 07:44  香草味羊扒饭  阅读(119)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3