BJFU 1397 致我们终将逝去的爱情
LIS
由于要记录轨迹,所以不能用O(nlogn)优化,直接dp加father记录每个节点的转移。
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 const int Nmax=2005; 5 int n; 6 int num[Nmax]; 7 int dp[Nmax]; 8 int ans[Nmax]; 9 int father[Nmax]; 10 int last; 11 int main() 12 { 13 //freopen("bjfu.in","r",stdin); 14 while(scanf("%d",&n)==1) 15 { 16 for(int i=1;i<=n;i++) 17 scanf("%d",&num[i]); 18 for(int i=0;i<=n;i++) 19 dp[i]=0; 20 for(int i=0;i<=n;i++) 21 { 22 ans[i]=0; 23 father[i]=0; 24 } 25 int ans_max=0; 26 for(int i=1;i<=n;i++) 27 { 28 dp[i]=1; 29 for(int j=1;j<i;j++) 30 { 31 if(num[j]<num[i] && dp[i]<dp[j]+1) 32 { 33 dp[i]=dp[j]+1; 34 father[i]=j; 35 } 36 } 37 if(ans_max<dp[i]) 38 { 39 ans_max=dp[i]; 40 last=i; 41 } 42 } 43 printf("%d\n",ans_max); 44 for(int i=1;i<=ans_max;i++) 45 { 46 ans[i]=last; 47 last=father[last]; 48 } 49 for(int i=ans_max;i>=1;i--) 50 { 51 printf("(%d,%d) ",ans[i],num[ans[i]]); 52 } 53 printf("\n"); 54 } 55 return 0; 56 }