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
    长度和最大
    ---------------------------------

  • 相关阅读:
    laravel 控制器方法里存get值 和 blade 模板获得闪存值的方法
    获取对象中的值的方法
    python3 语法小结
    集合一些方法陷阱
    文件的读写操作
    字符编码
    数字,字符串,列表,元祖,字典,集合类型内置方法
    if判断,while循环,for循环
    交互,格式化输出,运算符,解压缩!
    python基础知识
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3106624.html
Copyright © 2011-2022 走看看