首页 > 代码库 > POJ3903Stock Exchange&&POJ1631Bridging signals最长上升子序列 &&POJ1887Testing the CATCHER(最长下降子序列)(LIS模版题)
POJ3903Stock Exchange&&POJ1631Bridging signals最长上升子序列 &&POJ1887Testing the CATCHER(最长下降子序列)(LIS模版题)
题目链接:http://poj.org/problem?id=3903
题目链接:http://poj.org/problem?id=1631
题目链接:http://poj.org/problem?id=1887
题目解析:
这两道题都是直接求最长上升子序列,没什么好说的。
POJ 3903这题n为1000000,如果用n^2的算法肯定超时,所以要选择nlogn的算法。都是简单题。
#include <iostream>#include <string.h>#include <stdio.h>#include <algorithm>#include <math.h>#define eps 1e-9using namespace std;int n,len,a[100010],d[100010];int er(int q[],int l,int r,int key)//好好研究二分{ int mid; while(l<=r) { mid=(l+r)/2; if(q[mid]==key) { return mid; } else if(q[mid]>key) { r=mid-1; } else l=mid+1; } return l;}int main(){ int we; while(scanf("%d",&n)!=EOF) { for(int i=1; i<=n; i++) { scanf("%d",&a[i]); } len=1; d[len]=a[1]; for(int i=2; i<=n; i++) { if(a[i]>d[len]) { d[++len]=a[i]; } else { we=er(d,1,len,a[i]); d[we]=a[i]; } } printf("%d\n",len); } return 0;}
POJ1631:
#include <iostream>#include <string.h>#include <stdio.h>#include <algorithm>#include <math.h>#define eps 1e-9using namespace std;int n,len,a[40010],d[40010];int er(int q[],int l,int r,int key)//好好研究二分{ int mid; while(l<=r) { mid=(l+r)/2; if(q[mid]==key) { return mid; } else if(q[mid]>key) { r=mid-1; } else l=mid+1; } return l;}int main(){ int we,T; scanf("%d",&T); while(T--) { scanf("%d",&n); for(int i=1; i<=n; i++) { scanf("%d",&a[i]); } len=1; d[len]=a[1]; for(int i=2; i<=n; i++) { if(a[i]>d[len]) { d[++len]=a[i]; } else { we=er(d,1,len,a[i]); d[we]=a[i]; } } printf("%d\n",len); } return 0;}
POJ1887Testing the CATCHER:
#include <iostream>#include <string.h>#include <stdio.h>#include <algorithm>#include <math.h>using namespace std;int n,a[40002],d[40002],len;int er(int q[],int l,int r,int key)//好好研究二分{ int mid; while(l<=r) { mid=(l+r)/2; if(q[mid]==key) { return mid; } else if(q[mid]>key) { r=mid-1; } else l=mid+1; } return l;}int main(){ int tt,we,K=0; while(scanf("%d",&a[1])!=EOF&&a[1]!=-1) { tt=1; while(scanf("%d",&a[++tt])!=EOF&&a[tt]!=-1) ; tt-=1; len=1; d[len]=a[tt]; for(int i=tt-1; i>=1; i--) { if(a[i]>d[len]) { d[++len]=a[i]; } else { we=er(d,1,len,a[i]); d[we]=a[i]; } } printf("Test #%d:\n",++K); printf(" maximum possible interceptions: %d\n\n",len); } return 0;}
POJ3903Stock Exchange&&POJ1631Bridging signals最长上升子序列 &&POJ1887Testing the CATCHER(最长下降子序列)(LIS模版题)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。