• 最长上升子序列 CSU


    名词解释:

    一串数字比如1、5、3、6、9、8、10,它的子序列是从左到右不连续的若干个数,比如1、5、6,3、9、8、10都是它的子序列。

    最长上升子序列即从左到右严格增长的最长的一个子序列,1、5、6、9、10就是这个序列的一个最长上升子序列。

    给出若干序列,求出每个序列的最长上升子序列长度。

    Input

      多组数据,每组第一行正整数n,1 <= n <= 1000,第二行n个空格隔开的不大于1,000,000的正整数。

    Output

     每组数据输出一行,最长上升子序列的长度。

     

     

    Sample Input

    7
    1 5 3 6 9 8 10

    Sample Output

    5

    解题思路: LIS的题目,但是还不是很明白相关的算法,就使用了排序+LCS的方法

     1 #include <iostream>
     2 #include <algorithm>
     3 #include <stdio.h>
     4 #include <string.h>
     5 using namespace std;
     6 
     7 const int MAX  = 1000 + 92;
     8 int a[MAX],b[MAX];
     9 int visit[MAX][MAX];
    10 int n;
    11 
    12 void LCS()
    13 {
    14     for(int i = 1;i <=n;i++)
    15     {
    16 
    17         for(int j = 1;j <=n;j++)
    18         {
    19             if(a[i]==b[j])
    20                 visit[i][j] = visit[i-1][j-1] + 1;
    21             else if(visit[i-1][j]>visit[i][j-1])
    22                 visit[i][j] = visit[i-1][j];
    23             else
    24                 visit[i][j] = visit[i][j-1];
    25         }
    26 
    27     }
    28     cout<<visit[n][n]<<endl;
    29 
    30 }
    31 
    32 int main()
    33 {
    34 
    35     while(cin>>n)
    36     {
    37         memset(visit,0,sizeof(visit));
    38         a[0] = 0;
    39         b[0] = 0;
    40         for(int i = 1;i <=n;i++)
    41         {
    42             int temp;
    43             cin>>temp;
    44             a[i] = temp;
    45             b[i] = temp;
    46         }
    47 
    48         sort(b,b+n+1);
    49         LCS();
    50     }
    51 
    52 
    53     return 0;
    54 }
  • 相关阅读:
    双目对物体定位
    七个不变特征识别
    bmp和opencv格式转换
    职业规划
    input disp fprintf用法
    多线程
    访问权限
    机器人运动学仿真
    MOTOCOM32运动控制器编程
    回调函数以及钩子函数的概念
  • 原文地址:https://www.cnblogs.com/a2985812043/p/7277772.html
Copyright © 2020-2023  润新知