• 2.16 求数组中最长递增子序列


    问题:

    如标题,求数组中最长递增子序列。


    解法一:

    动态规划

    #include <stdio.h>
    #include <stdlib.h>
    #include<malloc.h>
    
    int LIS(int* array, int num)
    {
        int* temp = (int *)malloc(num*sizeof(int));
        int i = 0;
        int j = 0;
        int max = 0;
        for (i = 0; i < num; i++)
        {
            temp[i] = 1;
            for (j = 0; j < i; j++)
            {
                if (array[i] > array[j] && temp[j] + 1 > temp[i])
                {
                    temp[i] = temp[j] + 1;
                }
            }
        }
        max = temp[0];
        for (i = 1; i < num; i++)
        {
            if (temp[i] > max)
                max = temp[i];
        }
        free(temp);
        return max;
    }
    
    int main()
    {
        //printf("Hello world!
    ");
        int array[] = {1,-1,2,-3,4,-5,6,-7};
        printf("%d
    ", LIS(array, 8));
        return 0;
    }
    


    解法二:

    #include <stdio.h>
    #include <stdlib.h>
    #include<malloc.h>
    
    int Min(int* array, int num)
    {
        int i = 0;
        int min = array[0];
        for (i = 1; i < num; i++)
        {
            if (array[i] < min)
                min = array[i];
        }
        return min;
    }
    
    int LIS(int* array, int num)
    {
        int i = 0, j = 0;
        int* temp = (int *)malloc((num + 1) * sizeof(int));
        int* LIS = (int *)malloc(num * sizeof(int));
        temp[1] = array[0];
        temp[0] = Min(array, num) - 1;
        for (i = 0; i < num; i++)
        {
            LIS[i] = 1;
        }
        int nMaxLIS = 1;
        for(i = 1; i < num; i++)
        {
            for(j = nMaxLIS; j >= 0; j--)
            {
                if (array[i] > temp[j])
                {
                    LIS[i] = j + 1;
                    break;
                }
            }
            if (LIS[i] > nMaxLIS)
            {
                nMaxLIS = LIS[i];
                temp[LIS[i]] = array[i];
            }
            else if (temp[j] < array[i] && array[i] < temp[j + 1])
            {
                temp[j + 1] = array[i];
            }
        }
        return nMaxLIS;
    }
    
    int main()
    {
        //printf("Hello world!
    ");
        int array[] = {1,-1,2,-3,4,-5,6,-7};
        printf("%d
    ", LIS(array, 8));
        return 0;
    }
    



  • 相关阅读:
    python数据库操作读书笔记
    python玩微信跳一跳实验报告
    制作自己的第一个网页
    python文件读写笔记
    Ethernet(以太网) 详解 MAC、MII、PHY
    Ethernet(以太网) 物理介质(10Base、100Base-T、100Base-TX等)
    QByteArray 转 QBitArray
    QT 线程应用
    QT release 发布打包压缩
    Qt中利用qDebug()记日志到文件
  • 原文地址:https://www.cnblogs.com/pangblog/p/3317872.html
Copyright © 2020-2023  润新知