| 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; }
本文介绍了一种使用动态规划解决最长递增子序列问题的方法,并提供了两种算法实现:一种是O(N^2)的基本实现,另一种是通过二分查找优化到O(N*logN)的高效实现。
961

被折叠的 条评论
为什么被折叠?



