zoukankan      html  css  js  c++  java
  • 最长递增子序列(只求大小)模板

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    #define maxn 40005
    int main(){
        int a[8] = {5,4,6,8,7,10,3,6};
        int f[10];
        f[0] = 1;
        int ans = 0;
        for(int i=1;i<8;i++){
            f[i] = 1;
            for(int j=0;j<i;j++){//当j小于i(序列号),且j本身的数值也小于i本身的数值则满足排列的条件 
                if(a[j]<a[i]&&f[j]>f[i]-1){//之所以是大于f[i]-1是因为要保证现在的递增子序列是最长的 
                    f[i] = f[j] + 1;//加一加的是本身这个数 
                }
            }
            ans = max(ans,f[i]);//ans求的是最长的长度,最后一个不一定是最长的 
        }
        cout << ans << endl;
        return 0;
    }


    用二分法加快了查找符合条件的数构成递增子序列的过程

    #include <iostream>
    #include<cstdio>
    #include<algorithm>
    #include<string.h>
    using namespace std;
    int main(){
        int a[8] = {5,4,6,8,7,10,3,6};
        int B[9]; 
        B[0]=-10000;//把B[0]设为最小,假设任何输入都大于-10000;
        B[1]=a[0];//初始时,最大递增子序列长度为1的最末元素为a1
        int Len = 1;//Len为当前最大递增子序列长度,初始化为1;
        int p,r,m;//p,r,m分别为二分查找的上界,下界和中点;
        for(int i = 1;i<8;i++)
        {
            p=0;r=Len;
            while(p<=r)//二分查找最末元素小于ai+1的长度最大的最大递增子序列;
            {
               m = (p+r)/2;
               if(B[m]<a[i]) p = m+1;
               else r = m-1;
            }
            B[p] = a[i];//将长度为p的最大递增子序列的当前最末元素置为ai+1;
            if(p>Len) Len++;//更新当前最大递增子序列长度;
        }
        cout << Len << endl;
        return 0;
    }

    参考博客

    http://www.cnblogs.com/lonelycatcher/archive/2011/07/28/2119123.html

    注 这个博客求最长时错了

    彼时当年少,莫负好时光。
  • 相关阅读:
    js 工厂模式、简单模式、抽象模式
    Angular 框架介绍
    Node.js从入门到实战ECMAScript6一页纸总结(很大的一页纸)
    ECMAScript 5和ECMAScript6的新特性以及浏览器支持情况
    JSONP 教程
    jQuery ajax() 方法
    AJAX异步的 JavaScript
    自动化构建工具--gulp的初识和使用
    front-end 前端发展学习路线参考图
    Webpack 常用命令总结以及常用打包压缩方法
  • 原文地址:https://www.cnblogs.com/l609929321/p/7249297.html
Copyright © 2011-2022 走看看