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 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

题意:从左侧的图中去掉一些线段使剩余的线段都不相交,问最多能够剩下多少条线段

题解:由观察可知要想剩下的线段都不相交,则要求右侧线为单调递增的排序因为数据很大为避免超时

用二分法求最大递增序列的长度

求最大子序列长度的原理:

用一组数据来说明:5 8 9 2 3 1 7 4 6

显然我们可以观察出最长的子序列是2 3 4 6长度为四,设出一个数组a[]来存放子序列 设top=1为子序列长度;

接下来我们一个一个遍历  首先是5 则a[top++]=5;然后是8因为8>5所以a[top++]=8;9>8所以a[top++]=9

此时a数组中的元素为5 8 9;接下来遍历到2;因为5在当前a数组中最小而2<5,所以用2来覆盖5此时数组a变为2 8 9

接下来遍历到3因为2<3<8所以用3覆盖8此时数组a变为2 3 9接下来同理1覆盖2;7覆盖9;4覆盖7;到6时因为数组a

中所有数都比6小所以a[top++]=6;此时数组a中元素为1 3 4 6长度为top;(此法只能用来求最大递增子序列的长度

不能打印出最大递增子序列)

AC代码:

#include<stdio.h>
#include<string.h>
int main()
{
	int t;
	int p,top,l,r,mid,i,m;
	int a[44000];
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&p);
		scanf("%d",&a[0]);
		int top=0;
		for(i=1;i<p;i++)
		{
			scanf("%d",&m);
			if(a[top]<m)
				a[++top]=m;
			else
			{
				l=0;r=top;mid=0;
			    while(r>=l)
			    {
	    			mid=(r+l)/2;
	    			if(a[mid] < m)
	    			l=mid+1;
	    			else
	    			r=mid-1;
    			}
    			a[r+1]=m;
			}
		}
		printf("%d\n",top+1);
	}
	return 0;
}

  

时间: 2024-10-10 12:04:20

hdoj 1950 Bridging signals【二分求最大上升子序列长度】的相关文章

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 Bridging signals【最长上升序列】

解题思路:题目给出的描述就是一种求最长上升子序列的方法 将该列数an与其按升序排好序后的an'求出最长公共子序列就是最长上升子序列 但是这道题用这种方法是会超时的,用滚动数组优化也超时, 下面是网上找的求LIS的算法 假设要寻找最长上升子序列的序列是a[n],然后寻找到的递增子序列放入到数组b中. (1)当遍历到数组a的第一个元素的时候,就将这个元素放入到b数组中,以后遍历到的元素都和已经放入到b数组中的元素进行比较: (2)如果比b数组中的每个元素都大,则将该元素插入到b数组的最后一个元素,并

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[

poj 1631 Bridging signals DP(最长上升子序列)

最近一直在做<挑战程序设计竞赛>的练习题,感觉好多经典的题,都值得记录. 题意:给你t组数据,每组数组有n个数字,求每组的最长上升子序列的长度. 思路:由于n最大为40000,所以n*n的复杂度不够了,会超时. 书上状态方程换成了d[i]——以长度为i+1的上升子序列中末尾元素的最小值. 那么我们在遍历第i个元素时候,以这个元素为末尾元素的最长子序列也就是在d[i]中找到一个小于num[i]的最大值,然后在这个序列末尾加上num[i] 显然,我们在查找时便可以利用二分搜索,从而把复杂度从原来的

POJ 1631 Bridging signals(LIS:最长上升子序列)

http://poj.org/problem?id=1631 题意: (题意比较繁琐)本质就是: 给你一个长为n(n<=40000)的整数序列, 要你求出该序列的最长上升子序列LIS. 分析: 如果用O(n^2)的算法的话, 可能会超时. 所以用O(n*logn)的算法. 令g[i]==x表示当前遍历到的长度为i的所有最长上升子序列中的最小序列末尾值为x.(如果到目前为止, 根本不存在长i的上升序列, 那么x==INF无穷大) 假设当前遍历到了第j个值即a[j], 那么先找到g[n]数组的值a[

POJ - 1631 Bridging signals(最长上升子序列---LIS)

题意:左右各n个端口,已知n组线路,要求切除最少的线路,使剩下的线路各不相交,按照左端口递增的顺序输入. 分析: 1.设左端口为l,右端口为r,因为左端口递增输入,l[i] < l[j](i < j),因此若要不相交,r[i] < r[j],由此可以得出,只要求出对应的右端口序列的最长上升子序列的长度即可. 2.最长上升子序列: dp[i]---长度为i+1的上升子序列中末尾元素的最小值(若不存在,则为INT_INF). 如果子序列长度相同,那么最末位元素较小的在之后会更加有优势. #p

POJ 1631 Bridging signals(LIS+二分)

题目链接:POJ 1631 Bridging signals [题意]简单来说就是求最长上升子序列的长度. [思路]这道题目的数据规模有40000之多,如果用普通的动态规划O(n^2)肯定会超时的,所以要用上二分查找(又是二分啊,真牛逼)来进行优化,O(nlogn)的时间复杂度就OK了. 我使用了C++的lower_bound(ForwardIter first, ForwardIter last, const _Tp& val)函数.可以直接查找非递减序列[first, last)中的第一个大

POJ 1631 Bridging signals(LIS 二分 快速方法)

Language: Default Bridging signals Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 10762   Accepted: 5899 Description 'Oh no, they've done it again', cries the chief designer at the Waferland chip factory. Once more the routing designers