拦截导弹 --- 最长非递增递增子序列
只要是 求 递增递减 子序列什么的 都可以用那个 那个最长公共子序列的 方法 解决 , 不过 有一个需要注意的地方是 模版序列里面不能有 重复的数字 .
1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 #include<iostream> 5 #include<algorithm> 6 #include<queue> 7 #include<vector> 8 #include<set> 9 #include<stack> 10 #include<string> 11 #include<sstream> 12 #include<map> 13 #include<cctype> 14 using namespace std; 15 bool cmp(int a,int b) 16 { 17 return a>b; 18 } 19 int main() 20 { 21 int t,n,i,j,a[25],b[25],c[25][25]; 22 scanf("%d",&t); 23 while(t--) 24 { 25 scanf("%d",&n); 26 for(j=i=0;i<n;i++) 27 { 28 scanf("%d",&a[i]); 29 int mark=1; 30 for(int q=0;q<j;q++) 31 { 32 if(a[i]==b[q]) 33 { 34 mark=0; 35 break; 36 } 37 } 38 if(mark) 39 { 40 b[j]=a[i]; 41 j++; 42 } 43 } 44 int count1=j; 45 sort(b,b+count1,cmp); 46 memset(c,0,sizeof(c)); 47 for(int i=1;i<=count1;i++) 48 { 49 for(int j=1;j<=n;j++) 50 { 51 if(b[i-1]==a[j-1]) 52 c[i][j]=c[i-1][j-1]+1; 53 else 54 c[i][j]=c[i][j-1]>c[i-1][j]?c[i][j-1]:c[i-1][j]; 55 } 56 } 57 printf("%d\n",c[count1][n]); 58 } 59 return 0; 60 }