1. 程式人生 > >洛古 P1020 導彈攔截 N^2

洛古 P1020 導彈攔截 N^2

clas scanf 偏序 style class its ace 序列 can

第一問維護最長不升子序列,第二問維護最長上升子序列(根據Dilworth定理:偏序集的最少反鏈劃分數等於最長鏈的長度

第一問中,f[i]表示以a[i]結尾的最長不升子序列的最長長度,枚舉j (1~i-1) ,若a[j]>=a[i],則f[i]=max(f[i],f[j]+1);i(因為a[j]後面可以接下去一個a[i]了,所以是f[j]+1)

最長上升自己序列類似,把第一問的思路中的“>=”改為"<"(懶得寫了owo)

代碼(N^2做法喲):

 1 #include<bits/stdc++.h>
 2 using namespace
std; 3 int n=0,a[100010]; 4 int f1[100010],f2[100010],ans=-1; 5 int main(){ 6 while(~scanf("%d",&a[++n])); 7 n--; 8 f1[1]=1; 9 for(int i=2;i<=n;i++){ 10 f1[i]=1; 11 for(int j=i-1;j>=1;j--){ 12 if(a[j]>=a[i]){ 13 f1[i]=max(f1[i],f1[j]+1
); 14 } 15 } 16 ans=max(ans,f1[i]); 17 } 18 f2[1]=1; 19 printf("%d\n",ans); 20 ans=-1; 21 for(int i=2;i<=n;i++){ 22 f2[i]=1; 23 for(int j=i-1;j>=1;j--){ 24 if(a[j]<a[i]){ 25 f2[i]=max(f2[i],f2[j]+1
); 26 } 27 } 28 ans=max(ans,f2[i]); 29 } 30 printf("%d",ans); 31 return 0; 32 }

洛古 P1020 導彈攔截 N^2