最长上升子序列

本文将会用几道模板题来试着说明最长上升子序列该如何操作。

最长上升子序列

  • 一、最长上升子序列
    • 1.题目描述
    • 2.分析
    • 3.代码实现
  • 二、最长上升子序列II
    • 1. 题目描述
    • 2. 分析
    • 3.代码实现(一)
    • 4.代码实现(二)
  • 三、合唱队形
    • 1. 题目描述
    • 2.分析
    • 3.代码

一、最长上升子序列

题目链接

1.题目描述

给定一个长度为N的数列,求数值严格单调递增的子序列的长度最长是多少。
输入格式
第一行包含整数N。
第二行包含N个整数,表示完整序列。
输出格式
输出一个整数,表示最大长度。
数据范围
1≤N≤1000,
−109≤数列中的数≤109

2.分析

DP思路
(1)状态表示:f[i]一维数组便可表示 所有以第 i 个数结尾的上升子序列长度的最大值。
(2)状态计算:以倒数第二个数是谁考虑(最后一个数是a[i]),
j = 0, 1, 2…, i - 1, 且a[i] > a[j] : f[i] = max( f[j] + 1 )
时间复杂度:状态数量 * 计算一个花的时间, O(n ^ 2)

3.代码实现

#include 
#include 
using namespace std;
const int N = 1010;
int arr[N], f[N];
int main(void){
   
    int n;
    cin >> n;
    for(int i = 1; i <= n; i ++) scanf("%d", &arr[i]);
    for(int i = 1; i <= n; i ++){
   
        f[i] = 1;//只有i一个数
        for(int j = 1; j < i; j ++){
   
            if(arr[j] < arr[i]){
   
                f[i] = max(f[i], f[j] + 1);
            }

你可能感兴趣的:(笔记)