zoukankan      html  css  js  c++  java
  • 长度最大hdu1160最长有序子序列

    新手发帖,很多方面都是刚入门,有错误的地方请大家见谅,欢迎批评指正

        算法原理:

        数组a[]为待处理数组

        f[]用于记录a[]数组中,以对应位置数据为开头的最长有序序列长度

        p[]用于记录a[]数组中,以对应位置数据为开头的前一个数据位置

        使用position记录最大长度位置

        以a[]={1,4,7,2,5,8,3,6,9},盘算最长递增有序子序列为例

        初始化f[]={1, 1, 1, 1, 1, 1, 1,1,1},p[]={0,1,2,3,4,5,6,7,8}

        盘算f[i]时,f[i]=max(f[j]+1) ,(其中,a[i]>a[j],i>j>=0),意思是以a[i]为开头,找出在a[i]前比a[i]小的数据中以该数据为开头的最大有序子序列长度max(f[j]),则以a[i]开头的最大有序子序列长度为max(f[j])+1。盘算同时定义p[i]=j,标记a[i]为开头的最长子序列的前一个数据a[j]的位置。同时判断此时最大长度a[i]是不是比当前最大长度max大,如果a[i]更大则更新position

        a[]={1,4,7,2,5,8,3,6,9}

        i=0   f[]={1,1,1,1,1,1,1,1,1},  p[]={0,1,2,3,4,5,6,7,8}

        i=1   f[]={1,2,1,1,1,1,1,1,1},  p[]={0,0,2,3,4,5,6,7,8}  4>1,所以最大长度为2,position=1

        i=2   f[]={1,2,3,1,1,1,1,1,1},  p[]={0,0,1,3,4,5,6,7,8}  7>4,7>1 其中4开头的长度为2,所以最大长度为3,position=2

        i=3   f[]={1,2,3,2,1,1,1,1,1},  p[]={0,0,1,0,4,5,6,7,8}  2>1 所以最大长度为2

        i=4   f[]={1,2,3,2,3,1,1,1,1},  p[]={0,0,1,0,1,5,6,7,8}  5>1,5>4,5>2,其中以4开头的长度为2,所以最大长度为3

        i=5   f[]={1,2,3,2,3,4,1,1,1},  p[]={0,0,1,0,1,2,6,7,8}  8比前面的数据都大,所以最大长度为4,position=5

        i=6   f[]={1,2,3,2,3,4,3,1,1},  p[]={0,0,1,0,1,2,3,7,8}  3>1,3>2,其中以2开头的长度为2,所以最大长度为3

        每日一道理
    这浓浓的母爱使我深深地认识到:即使你是一只矫健的雄鹰,也永远飞不出母爱的长空;即使你是一条扬帆行驶的快船,也永远驶不出母爱的长河!在人生的路上不管我们已走过多远,还要走多远,我们都要经过母亲精心营造的那座桥!

        i=7   f[]={1,2,3,2,3,4,3,4,1},  p[]={0,0,1,0,1,2,3,4,8}  6>1,6>4,6>2,6>5,6>3,其中以5开头长度为3,所以最大长度为4

        i=8   f[]={1,2,3,2,3,4,3,4,5},  p[]={0,0,1,0,1,2,3,4,5}  9比前面数据都大,所以最大长度为5,position=8

        在对全部a中元素循环当时,通过max记录下最后数据位置,以及p记录的前一个数据的位置,可以递归求出LIS

    #include<stdio.h>
    #include<algorithm>
    using namespace std;
    int f[10001];
    int p[10001];
    struct Mouse
    {
        int w;
        int s;
        int n;
    } M[10001];
    bool compare(const Mouse &a, const Mouse &b)
    {
        if(a.w==b.w)
            return a.s > b.s;
        else
            return a.w < b.w;
    }
    void printLIS(int max_l)
    {
        if(p[max_l]==max_l)
        {
            printf("%d\n",M[max_l].n);
            return;
        }
        printLIS(p[max_l]);
        printf("%d\n",M[max_l].n);
    }
    int main()
    {
        int i=1,max=0,max_l=0;
        while(scanf("%d %d",&M[i].w,&M[i].s)!=EOF)
        {
            f[i]=1;
            p[i]=i;
            M[i].n=i;
            i++;
        }
        sort(M+1,M+i,compare);
        for(int k=1; k<i+1; k++)
        {
            for(int j=1; j<k; j++)
            {
                if(M[j].s>M[k].s&&M[j].w<M[k].w)
                {
                    if((f[j]+1)>f[k])
                    {
                        f[k]=f[j]+1;
                        p[k]=j;
                        if(f[k]>max)
                        {
                            max = f[k];
                            max_l = k;
                        }
                    }
                }
            }
        }
        printf("%d\n",max);
        printLIS(max_l);
        return 0;
    }

        

    文章结束给大家分享下程序员的一些笑话语录: 系统程序员
      1、头皮经常发麻,在看见一个蓝色屏幕的时候比较明显,在屏幕上什幺都看不见的时候尤其明显;
      2、乘电梯的时候总担心死机,并且在墙上找reset键;
      3、指甲特别长,因为按F7到F12比较省力;
      4、只要手里有东西,就不停地按,以为是Alt-F、S;
      5、机箱从来不上盖子,以便判断硬盘是否在转;
      6、经常莫名其妙地跟踪别人,手里不停按F10;
      7、所有的接口都插上了硬盘,因此觉得26个字母不够;
      8、一有空就念叨“下辈子不做程序员了”;
      9、总是觉得9号以后是a号;
      10、不怕病毒,但是很害怕自己的程序;

    --------------------------------- 原创文章 By
    长度和最大
    ---------------------------------

  • 相关阅读:
    Parameter Binding in ASP.NET Web API
    Which HTTP methods match up to which CRUD methods?
    ErrorHandling in asp.net web api
    HttpStatusCode
    Autofac Getting Started(默认的构造函数注入)
    Autofac Controlling Scope and Lifetime
    luvit 被忽视的lua 高性能框架(仿nodejs)
    undefined与null的区别
    VsCode中使用Emmet神器快速编写HTML代码
    字符串匹配---KMP算法
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3106624.html
Copyright © 2011-2022 走看看