Time Limit:1000MS | Memory Limit:10000K | |
Description
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 specifies 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
Output
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
这是刚刚开始写的O(N^2)算法,提交后TLE
/* Author yan *POJ 1631 *Bridging signals */ #include<stdio.h> int opt[40000]; int n; int value[40000]; int main() { int i,j; int test_case; int max; freopen("input","r",stdin); scanf("%d",&test_case); while(test_case--) { scanf("%d",&n); memset(opt,0,sizeof(opt)); max=-1; for(i=0;i<n;i++) scanf("%d",&value[i]); for(i=0;i<n;i++) { opt[i]=1; for(j=0;j<i;j++) { if(value[i]>value[j]&&opt[i]<opt[j]+1) opt[i]=opt[j]+1; } if(max<opt[i]) max=opt[i]; } printf("%d/n",max); } return 0; }
看到网上的的优化,时间复杂度优化成O(N*logN)
/* Author yan *POJ 1631 *Bridging signals */ #include<stdio.h> #define MAX 40000 int n; int value[MAX];///记录原始数组 int opt[MAX+1];///记录长度为k的最长递增序列的结尾元素,下标从1开始 //int len[MAX];///记录以value[k]结尾的最长递增子序列的长度 int LIS(const int value[],const int n) { int i,j; int size=1; opt[1]=value[0]; //len[0]=1; for(i=1;i<n;i++) { if(value[i]<=opt[1]) j=1;//<=换为< else if(value[i]>opt[size]) j=++size;// > 换为: >= else j=binary_search(opt,size,value[i]); //printf("j=%d/n",j); opt[j]=value[i]; //len[i]=j; } return size; } int binary_search(const int opt[],const int size,const int value) { int left=1; int right=size; int mid; while(left<=right) { mid=(left+right)/2; if(value==opt[mid]) return mid; else if(value>opt[mid] && value<=opt[mid+1]) return mid+1;// >&&<= 换为: >= && < else if(value<opt[mid]) right=mid-1; else left=mid+1; } } int main() { int i,j; int test_case; int max; //freopen("input","r",stdin); scanf("%d",&test_case); while(test_case--) { scanf("%d",&n); //memset(opt,0,sizeof(opt)); for(i=0;i<n;i++) scanf("%d",&value[i]); printf("%d/n",LIS(value,n)); } return 0; }