HDU 1950 Bridging signals【最长上升序列】

解题思路:题目给出的描述就是一种求最长上升子序列的方法 将该列数an与其按升序排好序后的an‘求出最长公共子序列就是最长上升子序列

但是这道题用这种方法是会超时的,用滚动数组优化也超时,

下面是网上找的求LIS的算法

假设要寻找最长上升子序列的序列是a[n],然后寻找到的递增子序列放入到数组b中。

(1)当遍历到数组a的第一个元素的时候,就将这个元素放入到b数组中,以后遍历到的元素都和已经放入到b数组中的元素进行比较;

(2)如果比b数组中的每个元素都大,则将该元素插入到b数组的最后一个元素,并且b数组的长度要加1;

(3)如果比b数组中最后一个元素小,就要运用二分法进行查找,查找出第一个比该元素大的最小的元素,然后将其替换。

在这个过程中,只重复执行这两步就可以了,最后b数组的长度就是最长的上升子序列长度。

例如样例给的 4  2 6 3 1 5

那么

4//

2//用2替换4

2 6//加入6

2 3//用3替换6

1 3//用1替换2

1 3 5//加入5

注意最后得到的a数组中的数为1  3  5

而实际上我们要求的最长上升序列为 2 3 5 但是我们只需要求长度,所以不影响

Bridging signals

Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 736    Accepted Submission(s): 486

Problem Description

‘Oh no, they‘ve done it again‘, cries the chief designer at the Waferland chip factory. Once more the routing designers have screwed up completely, making the signals on the chip connecting the ports of two functional blocks cross each other all over the place. At this late stage of the process, it is too expensive to redo the routing. Instead, the engineers have to bridge the signals, using the third dimension, so that no two signals cross. However, bridging is a complicated operation, and thus it is desirable to bridge as few signals as possible. The call for a computer program that finds the maximum number of signals which may be connected on the silicon surface without rossing each other, is imminent. Bearing in mind that there may be housands of signal ports at the boundary of a functional block, the problem asks quite a lot of the programmer. Are you up to the task? Figure 1. To the left: The two blocks‘ ports and their signal mapping (4,2,6,3,1,5). To the right: At most three signals may be routed on the silicon surface without crossing each other. The dashed signals must be bridged.
A typical situation is schematically depicted in figure 1. The ports of the two functional blocks are numbered from 1 to p, from top to bottom. The signal mapping is described by a permutation of the numbers 1 to p in the form of a list of p unique numbers in the range 1 to p, in which the i:th number pecifies which port on the right side should be connected to the i:th port on the left side. Two signals cross if and only if the straight lines connecting the two ports of each pair do.

Input

On the first line of the input, there is a single positive integer n, telling the number of test scenarios to follow. Each test scenario begins with a line containing a single positive integer p<40000, the number of ports on the two functional blocks. Then follow p lines, describing the signal mapping: On the i:th line is the port number of the block on the right side which should be connected to the i:th port of the block on the left side.

Output

For each test scenario, output one line containing the maximum number of signals which may be routed on the silicon surface without crossing each other.

Sample Input

4
6
4
2
6
3
1
5
10
2
3
4
5
6
7
8
9
10
1
8
8
7
6
5
4
3
2
1
9
5
8
9
2
3
1
7
4
6

Sample Output

3
9
1
4

#include<stdio.h>
int b[500010],f[500010];
int bserch(int f[],int n,int v)
{
    int x,y,m;
    x=1;
    y=n;
    while(x<=y)
    {
        m=(x+y)/2;
        if(v>=f[m])
        x=m+1;
        else
        y=m-1;
    }
    return x;
}
int main()
{
    int i, n,len,ncase,tmp,x,y;
    scanf("%d",&ncase);
    while(ncase--)
    {
    	scanf("%d",&n);
        for(i=1;i<=n;i++)
        scanf("%d",&b[i]);
        len=1;
        f[1]=b[1];

        for(i=2;i<=n;i++)
        {
            if(b[i]>=f[len])
            {
                len++;
                f[len]=b[i];
            }
            else
            {
                tmp=bserch(f,len,b[i]);
                f[tmp]=b[i];
            }
        }
        printf("%d\n",len);
    }
}

  

时间: 2024-10-10 09:44:47

HDU 1950 Bridging signals【最长上升序列】的相关文章

HDU 1950 Bridging signals(LIS O(nlogn))

Bridging signals Problem Description 'Oh no, they've done it again', cries the chief designer at the Waferland chip factory. Once more the routing designers have screwed up completely, making the signals on the chip connecting the ports of two functi

HDU 1950 Bridging signals (LIS,二分法,O(nlogn))

题意: 给一个数字序列,要求找到LIS,输出其长度. 思路: 扫一遍+二分,复杂度O(nlogn),空间复杂度O(n). 具体方法:增加一个数组,用d[i]表示长度为 i 的递增子序列的最后一个元素,且该元素总是保持当前最小.初始化d[1]=A[i],当前LIS的长度len=1.从 2 to n,若A[i]>d[len],则d[++len]=A[i],否则,在数组d中找到A[i]应该插入的位置,代替掉那个第一个比它大的数字,比如d[k]<A[i]<=d[k+1],直接将A[i]代替掉d[

hdoj 1950 Bridging signals【二分求最大上升子序列长度】

Bridging signals Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 961    Accepted Submission(s): 627 Problem Description 'Oh no, they've done it again', cries the chief designer at the Waferland

hdu----(1950)Bridging signals(最长递增子序列 (LIS) )

Bridging signals Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 667    Accepted Submission(s): 443 Problem Description 'Oh no, they've done it again', cries the chief designer at the Waferland

hdu 1159(DP+字符串最长公共序列)

http://blog.csdn.net/a_eagle/article/details/7213236 公共序列可以用一个二维数组dp[i][j]保存每个点时的最大数字,本质就是一个双向比较. dp[i][j] = dp[i-1][j-1]+1;(a[i]==b[j]) dp[i][j] = max(dp[i][j-1],dp[i-1][j]);(a[i]!=b[j]) 处理字符串时可以用sf("%s",a+1)来将字符串从1开始保存,这时strlen()也要用a+1 #includ

HDU 1950(LIS)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1950 Bridging signals Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3711    Accepted Submission(s): 2337 Problem Description 'Oh no, they've don

zoj1986 Bridging Signals (dp,最长递增序列,LIS)

A - Bridging Signals Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu Submit Status Practice ZOJ 1986 Description 'Oh no, they've done it again', cries the chief designer at the Waferland chip factory. Once more the routing designer

Bridging signals(求最长上升自序列nlogn算法)

Bridging signals Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 2582    Accepted Submission(s): 1665 Problem Description 'Oh no, they've done it again', cries the chief designer at the Waferlan

hdu 1950 最长上升子序列

1 //Accepted 3540 KB 62 ms 2 //dp 最长上升子序列 3 #include <cstdio> 4 #include <cstring> 5 #include <iostream> 6 using namespace std; 7 const int imax_n = 400005; 8 int dp[imax_n]; 9 int d[imax_n]; 10 int a[imax_n]; 11 int n; 12 int len; 13 in