acwing 895 最长上升子序列1

简介: acwing 895 最长上升子序列1

活动 - AcWing

自己做的时候搞成二维数组了  推荐一维数组

#include<iostream>
#include<cstring>
#include<algorithm>
 
using namespace std ;
typedef long long LL ; 
const LL N = 1010 ;
LL n ;
LL a[N] ; 
LL f[N][N] ;//表示前i个数以j结尾的最长上升子序列长度
 
int main(){
  int n ; cin >> n ;
  for(int i = 1 ; i <= n ; i ++) cin >>a[i] ;
  f[1][1] = 1;
  for(int i = 1 ; i <= n ; i ++) f[i][i] = 1 ;// 每一个数的长度初始化为1
  for(int i = 2 ; i <= n ; i ++){
    for(int j = 1 ; j < i ; j ++){
      f[i][j] = f[i-1][j] ;// 继承前i-1个数的以j结尾的最长上升子序列数
      if(a[i] > a[j]) f[i][i] = max(f[i][i] , f[i-1][j] + 1) ;
                //我们只需要更新f[i][i]的长度因为只有i是新加入的
                //对于每一个符合if条件的 我们都取 当前的 和 加1的 的最大值
    }
  }
  LL ans = 0 ;
  for(int i = 1 ; i <= n ; i ++ ) ans = max(ans , f[n][i]) ;
    //前n个数 找数组中的最大值即为最终答案
  cout << ans << endl ;
  return 0 ;
}
 
//一维数组答案  麻痹我自己写的麻烦了  才发现
#include<iostream>
#include<algorithm>
#include<cstring>
 
using namespace std ;
const int N = 1010 ;
int  a[N] ;
int len[N] ;
int main(){
  int n ; cin >> n ;
  for(int i = 1 ; i <= n ; i ++) cin >> a[i] ;
  
  for(int i = 1 ; i <= n ; i ++){
    len[i] ++ ;
    for(int j = 1 ; j < i ; j ++){
      if(a[j] < a[i]){
        len[i] = max(len[i] , len[j] + 1);
      } 
    }
  }
  int ans = 0 ;
  for(int i = 1 ; i<=n ;i ++) ans = max(ans, len[i]) ;
  cout << ans << endl ;
  return 0; 
}
目录
相关文章
【动态规划刷题 15】最长定差子序列&& 最长的斐波那契子序列的长度
【动态规划刷题 15】最长定差子序列&& 最长的斐波那契子序列的长度
|
3天前
acwing 896 最长上升子序列II
acwing 896 最长上升子序列II
10 2
|
3天前
acwing 897 最长公共子序列
acwing 897 最长公共子序列
8 0
acwing 897 最长公共子序列
|
2天前
acwing 1016 最大上升子序列和
acwing 1016 最大上升子序列和
6 0
|
5月前
leetcode-300:最长递增子序列
leetcode-300:最长递增子序列
39 0
Acwing 3692. 最长连续公共子序列
Acwing 3692. 最长连续公共子序列
59 0
|
人工智能
线性DP——AcWing 898. 数字三角形、AcWing 895. 最长上升子序列
线性DP——AcWing 898. 数字三角形、AcWing 895. 最长上升子序列
76 0
|
算法
Leecode 300. 最长上升子序列
Leecode 300. 最长上升子序列
61 0
leetcode 300 最长递增子序列
leetcode 300 最长递增子序列
76 0
leetcode 300 最长递增子序列
|
算法 Python
LeetCode 300. 最长递增子序列
最长递增子序列 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。
121 0