(闫氏dp分析法)(线性dp)(区间类dp)AcWing 895. 最长上升子序列

简介: (闫氏dp分析法)(线性dp)(区间类dp)AcWing 895. 最长上升子序列

题目链接

AcWing 895. 最长上升子序列 - AcWing

一些话

切入点

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

区间长度类的最优解,符合dp特征(maxn)

数据范围

1≤N≤1000

1e3的数据范围,符合dp特征

流程

// 状态表示,用一维f[i]来表示以a[i]为结尾的最大上升子序列长度

            属性是最大值

// 状态计算,找最后一位不同的作为分界点

           最后一位都是a[i],相同,继续往前找

           // a[i-1],有不同,不是所有情况都包含,开始划分集合:

           a[1] ~ a[i-1]

           a[2] ~ a[i-1]

           a[3] ~ a[i-1]

           …………

           a[i-1] ~ a[i-1]

            空


           在里面找出最大值

            划分出来的这部分集合的最大值就等价于f[i-1](以a[i-1]为结尾的最大上升子序列),在前一层中可以求到


划分出来的集合


           a[1] ~ a[i-1]

           a[2] ~ a[i-1]

           a[3] ~ a[i-1]

           …………

           a[i-1] ~ a[i-1]


“空”代表的原本是a[i],所有集合减去a[i]后,原本表示a[i]的集合就变成了空


(,按照这样一直到第一层

套路

区间类的最优解dp

{

f[i]集合表示成以a[i]为结尾的区间

集合划分成不同起点到a[i-1],等价于f[i-1]来计算

}

ac代码

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 1100;
int f[N],a[N];
int main(){
    int n;
    cin >> n;
    for(int i = 1;i <= n;i++){
        cin >> a[i];
    }
    for(int i = 1;i <= n;i++){
        f[i] = 1;
        for(int j = 1;j < i;j++){
            if(a[j] < a[i]){
                f[i] = max(f[i],f[j] + 1);
            }
        }
    }
    int res = 0;
    for(int i = 1;i <= n;i++){
        res = max(f[i],res);
    }
    cout << res << endl;
    return 0;
}
目录
相关文章
|
8月前
【每日一题Day289】LC1749任意子数组和的绝对值的最大值 | dp
【每日一题Day289】LC1749任意子数组和的绝对值的最大值 | dp
53 0
|
算法 测试技术 C++
C++二分算法习题:判断是否是完全平方数[容易]和排列箱子[容易]
C++二分算法习题:判断是否是完全平方数[容易]和排列箱子[容易]
|
7月前
【题解】NowCoder DP4 最小花费爬楼梯
【题解】NowCoder DP4 最小花费爬楼梯
41 5
|
8月前
【错题集-编程题】删除相邻数字的最大分数(动态规划 - 线性 dp)
【错题集-编程题】删除相邻数字的最大分数(动态规划 - 线性 dp)
剑指offer_数组---旋转数组的最小数字
剑指offer_数组---旋转数组的最小数字
49 0
leetcode剑指offer53–n-1中缺失的数字(二分//or等差数列)
leetcode剑指offer53–n-1中缺失的数字(二分//or等差数列)
|
C++
(排列,选择类dp)(数论同余定理,同余运算)(以背包为母题)1214. 波动数列
(排列,选择类dp)(数论同余定理,同余运算)(以背包为母题)1214. 波动数列
103 0
每日一题:Leetcode209 长度最小的子数组
每日一题:Leetcode209 长度最小的子数组
|
存储 C++
【力扣·每日一题】689. 三个无重叠子数组的最大和 (C++ 前缀和优化dp 保存路径)
【力扣·每日一题】689. 三个无重叠子数组的最大和 (C++ 前缀和优化dp 保存路径)
115 0
【力扣·每日一题】689. 三个无重叠子数组的最大和 (C++ 前缀和优化dp 保存路径)
|
人工智能 Unix Linux
LeetCode 70爬楼梯&71简化路径&72编辑距离(dp)
以 Unix 风格给出一个文件的绝对路径,你需要简化它。或者换句话说,将其转换为规范路径。 在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (…) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。更多信息请参阅:Linux / Unix中的绝对路径 vs 相对路径
135 0
LeetCode 70爬楼梯&71简化路径&72编辑距离(dp)