zoukankan      html  css  js  c++  java
  • 最长上升子序列 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 }
  • 相关阅读:
    [BZOJ]2959: 长跑
    http状态码 超详细
    mysql注入常用函数
    tomcat7远程代码执行 ImageMagick 命令执行漏洞
    kali安装redis
    反序列化
    CSP 之dvwa
    token防爆破?
    变量覆盖
    安全狗绕过
  • 原文地址:https://www.cnblogs.com/a2985812043/p/7277772.html
Copyright © 2011-2022 走看看