最长上升子序列(LIS)

部署运行你感兴趣的模型镜像

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1134&judgeId=529543
dp[len] d p [ l e n ] 表示长度为l en e n 的序列中,最后一个数的多少

#include"bits/stdc++.h"
using namespace std;
const int maxn=1e5+5;
int dp[maxn];
int main()
{
    int N;
    while(cin>>N)
    {
        memset(dp,-0x3f,sizeof(dp));

        int len=1;
        cin>>dp[1];
        for(int i=1;i<N;i++)
        {
            int t;
            cin>>t;
            if(t>dp[len])dp[++len]=t;
            else
            {
                int pos=upper_bound(dp+1,dp+1+len,t)-dp;
                dp[pos]=t;
            }
        }
        cout<<len<<endl;
    }
}

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

### C++ 实现最长上升子序列 (LIS) 算法 #### 示例代码解释 对于给定的一个整数数组 `a`,目标是找出其中最长严格递增子序列并返回该序列的最大长度。下面展示了一种基于动态规划的方法来解决问题。 ```cpp #include <iostream> #include <algorithm> // For std::max function using namespace std; int main() { int a[1005], dp[1005], ans = 0; int n; cin >> n; // 输入数组大小 for (int i = 1; i <= n; ++i) { cin >> a[i]; // 输入数组元素 } for (int i = 1; i <= n; ++i) { dp[i] = 1; // 初始化dp数组,默认每个位置至少可以构成长度为1的上升子序列 for (int j = 1; j < i; ++j) { if (a[j] < a[i]) { // 如果存在更早的位置上的数值小于当前位置,则更新dp值 dp[i] = max(dp[i], dp[j] + 1); } } ans = max(ans, dp[i]); // 更新最大上升子序列长度 } cout << ans; // 输出最终的结果 return 0; } ``` 这段程序首先读取输入的数据到数组 `a[]` 中,并初始化另一个同样大小的辅助数组 `dp[]` 来记录到达每一个索引处所能形成的最长上升子序列长度。遍历整个数组,在每一步都尝试寻找之前已经访问过的所有可能形成新的上升子序列的情况,并据此调整当前节点对应的 `dp[]` 值。最后输出的是在整个过程中发现的最大上升子序列长度[^1]。 此方法的时间复杂度为 O(),适用于较小规模的数据集(n ≤ 1e4)。当面对更大范围内的数据时,建议采用更加高效的算法比如贪心加二分查找的方式来进行优化处理[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值