3761 - 航线
Time Limit : 1 秒
Memory Limit : 128 MB
Palmia 河在某国从东向西流过,并把该国分为南北两个部分。河的两岸各有 n 个城市,且北岸的每一个城市都与南岸的某个城市是友好城市,而且对应的关系是一一对应的。现在要求在两个友好城市之间建立一条航线,但由于天气的关系,所有航线都不能相交,因此,就不可能给所有的友好城市建立航线。
问题:当城市个数和友好关系建立之后,选择一种修建航线的方案,能建最多的航线而不相交。(若有多种方案,修建航线最多且城市数量相同,选择从前到后城市标号字典序小的那种方案.)
Input
输入由若干行组成,第一行有一个整数,n(1≤n≤10000);表示城市数。第2至n+1行依次是南岸城市的北岸友好城市编号。
Output
输出共两行,第一行是建立航线的数量。第二行是建立航线的北岸城市编号。
Examples
Input Format
14 13 7 9 16 38 24 37 18 44 19 21 22 63 15
Output Format
8 7 9 16 18 19 21 22 63
Solution C++
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> using namespace std; int i,m,n,j,a[10001],b[10001],l,jl,c[10001],t; int main() { // freopen("maxxl.in","r",stdin); // freopen("maxxl.out","w",stdout); cin>>n; for (i=1;i<=n;++i) { cin>>a[i];b[i]=1; } m=1;l=1;jl=1; for (i=2;i<=n;++i) for (j=1;j<=i-1;++j) { if (a[j]<=a[i]&&b[j]+1>b[i]) b[i]=b[j]+1; if (b[i]>m) { m=b[i]; l=i;jl=i; } } cout<<m<<endl; t=1;c[1]=a[l]; for (j=1;j<=m;++j) for (i=1;i<=l-1;++i) { if (a[i]<=a[jl]&&i<=jl&&b[i]==b[jl]-1) { jl=i; t+=1;c[t]=a[i]; break; } } for (i=t;i>=1;--i) cout<<c[i]<<" "; // fclose(stdin); // fclose(stdout); //system("pause"); return 0; }