(闫氏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;
}
目录
相关文章
|
2天前
|
算法 测试技术 C++
【数位dp】【动态规划】C++算法:233.数字 1 的个数
【数位dp】【动态规划】C++算法:233.数字 1 的个数
|
2天前
|
算法 测试技术
【数位dp】【动态规划】【状态压缩】【推荐】1012. 至少有 1 位重复的数字
【数位dp】【动态规划】【状态压缩】【推荐】1012. 至少有 1 位重复的数字
|
2天前
|
消息中间件 Kubernetes JavaScript
动态规划-区间、计数类DP问题总结
动态规划-区间、计数类DP问题总结
|
2天前
|
算法 程序员 索引
【算法训练-动态规划 三】【双序列DP问题】最长重复子数组、最长公共子串、最长公共子序列、编辑距离
【算法训练-动态规划 三】【双序列DP问题】最长重复子数组、最长公共子串、最长公共子序列、编辑距离
70 0
|
12月前
|
算法 C++
每日算法系列【LeetCode 329】矩阵中的最长递增路径
每日算法系列【LeetCode 329】矩阵中的最长递增路径
|
C++
(排列,选择类dp)(数论同余定理,同余运算)(以背包为母题)1214. 波动数列
(排列,选择类dp)(数论同余定理,同余运算)(以背包为母题)1214. 波动数列
66 0
|
存储 C++
【力扣·每日一题】689. 三个无重叠子数组的最大和 (C++ 前缀和优化dp 保存路径)
【力扣·每日一题】689. 三个无重叠子数组的最大和 (C++ 前缀和优化dp 保存路径)
82 0
【力扣·每日一题】689. 三个无重叠子数组的最大和 (C++ 前缀和优化dp 保存路径)
|
人工智能 Unix Linux
LeetCode 70爬楼梯&71简化路径&72编辑距离(dp)
以 Unix 风格给出一个文件的绝对路径,你需要简化它。或者换句话说,将其转换为规范路径。 在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (…) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。更多信息请参阅:Linux / Unix中的绝对路径 vs 相对路径
101 0
LeetCode 70爬楼梯&71简化路径&72编辑距离(dp)
|
算法
区间问题(贪心)(一)
复习acwing算法基础课的内容,本篇为讲解基础算法:贪心——区间选点,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。
113 0
区间问题(贪心)(一)
|
存储 C++
区间问题(贪心)(二)
AcWing 906. 区间分组
66 0
区间问题(贪心)(二)