• HDU4521


    一个改变的最长上升子序列(LIS),这种题型做的很少,今天做起来很费劲,查了很多资料,还把最基础的LIS补了一遍,具体的看代码吧,我把思路都放在了注释里面

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<cstring>
    #include<cstdlib>
    #include<sstream>
    #include<set>
    #include<algorithm>
    #include<queue>
    #include<stack>
    #include<vector>
    #include<ctime>
    #include<fstream>
    #include<iomanip>
    #include<map>
    using namespace std;
    const int inf=0x3f3f3f3f;
    int arr[100000+10];
    int ans[100000+10];
    int lim[100000+10];
    int main()
    {
        int n,d;
        while(scanf("%d %d",&n,&d)!=EOF)
        {
            for(int i=1;i<=n;i++)
            {
                scanf("%d",&arr[i]);
            }
            for(int i=1;i<=n;i++)
            {
                ans[i]=inf;
            }
            int len=1;
            for(int i=1;i<=n;i++)
            {
                int pos=lower_bound(ans+1,ans+n+1,arr[i])-ans;
                //cout<<"arr["<<i<<"]: "<<arr[i];
              //  cout<<" pos :"<<pos<<" ans["<<i<<"] :"<<ans[i]<<endl;
                lim[i]=pos;//lim数组的作用是用来限制下标的如果下表差没满足限制条件的话子序列长度就不会增加
                if(len==pos)//长度和返回的位置pos相同子序列长度就会增加是因为在当前长度已经存在一个满足了下标限制条件并且数值也满足的数存在了
                {
                    len++;
                }
                int j=i-d;
                if(j>0&&ans[lim[j]]>arr[j])
                {
                    ans[lim[j]]=arr[j];//这里是更新,在ans[i]中存下最小的i长度的末元素
                }
            }
            cout<<len-1<<endl;//因为数组从1开始的最后长度要减1
    
        }
        return 0;
    }
  • 相关阅读:
    Roce ofed 环境搭建与测试
    Ubuntu 1804 搭建NFS服务器
    Redhat 8.0.0 安装与网络配置
    Centos 8.1 安装与网络配置
    SUSE 15.1 系统安装
    VSpare ESXi 7.0 基本使用(模板、iso、SRIOV)
    VSpare ESXi 7.0 服务器安装
    open SUSE leap 15.1 安装图解
    KVM虚拟机网卡连接网桥
    GitHub Action一键部署配置,值得拥有
  • 原文地址:https://www.cnblogs.com/lulichuan/p/6516713.html
Copyright © 2020-2023  润新知