(闫氏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;
}
目录
相关文章
|
9月前
|
消息中间件 Kubernetes JavaScript
动态规划-区间、计数类DP问题总结
动态规划-区间、计数类DP问题总结
|
算法 测试技术 C++
C++二分算法习题:判断是否是完全平方数[容易]和排列箱子[容易]
C++二分算法习题:判断是否是完全平方数[容易]和排列箱子[容易]
|
8月前
|
机器学习/深度学习 人工智能 JavaScript
技术心得记录:最长公共子序列(LCS)详解+例题模板(全)(转)
技术心得记录:最长公共子序列(LCS)详解+例题模板(全)(转)
|
9月前
【错题集-编程题】删除相邻数字的最大分数(动态规划 - 线性 dp)
【错题集-编程题】删除相邻数字的最大分数(动态规划 - 线性 dp)
|
9月前
【编程题-错题集】连续子数组最大和(动态规划 - 线性 dp)
【编程题-错题集】连续子数组最大和(动态规划 - 线性 dp)
|
9月前
|
人工智能 算法
前缀和算法题(区间次方和、小蓝平衡和、大石头的搬运工、最大数组和)
前缀和算法题(区间次方和、小蓝平衡和、大石头的搬运工、最大数组和)
|
9月前
|
算法 测试技术 C++
【组合数学】【动态规划】【前缀和】1735生成乘积数组的方案数
【组合数学】【动态规划】【前缀和】1735生成乘积数组的方案数
|
9月前
|
机器学习/深度学习 存储 算法
数据结构与算法面试题:给定非负整数 m 和 n,计算不大于 m 的数字中,素数的个数。(提示:算法原理为埃氏筛、线性筛)
数据结构与算法面试题:给定非负整数 m 和 n,计算不大于 m 的数字中,素数的个数。(提示:算法原理为埃氏筛、线性筛)
116 0
|
C++
(排列,选择类dp)(数论同余定理,同余运算)(以背包为母题)1214. 波动数列
(排列,选择类dp)(数论同余定理,同余运算)(以背包为母题)1214. 波动数列
110 0
(序列)(贪心)(LIS)(区间dp)最少拦截系统
(序列)(贪心)(LIS)(区间dp)最少拦截系统
89 0