最长上升子序列 刷题笔记

文章详细介绍了如何使用动态规划方法求解给定数组中最长上升子序列的问题,通过迭代计算每个元素可以构成的最长子序列长度,并在代码中展示了C++实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路 

dp 我们用f[i]来表示 a[i]可以构成的最长上升子序列

首先 一个数字就是长度为1的序列

所以我们需要将所有的f[i]初始化为1

然后我们考虑状态

比如 f[j]

当指针来到a[j]这个数 

前面所有数已经算完固定

则a[j]所能形成的最长上升子序列的条件是

1.a[j]大于前面的数

2.f[i]是小于a[j]里面的数之中子序列最长的

如果满足条件

则f[j]=f[i]+1;加上a[j]这个元素长度加1 

模拟例子

当指针来到a【1】

前面没有比他小的数 f[1]=1;

来到a[2]

3>1

f【2】=1;

来到a[3]

1<2;

所以f[2]可以继承1 形成的最长子序列

f[3]=2;

···

来到最后一个数

其前面小于他且子序列最长的数是5

因此 直接继承5的子序列且长度+1;

因此最终答案为4;

代码

#include<iostream>
#include<cstring>
#include<cstdio>
#include <algorithm>
using namespace std;
const int N=1010;
int a[N],f[N];
int main(){
    int n;
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>a[i];
        f[i]=1; 
    }
    int res=0;
    for(int i=0;i<n;i++){
        for(int j=0;j<i;j++){
            if(a[i]>a[j]){
                f[i]=max(f[i],f[j]+1);
                res=max(res,f[i]);
            }
        }
    }
    cout<<res;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值