试题描述
|
求最长不下降子序列的长度。 设有由n个不相同的整数组成的数列,记为:a[1]、a[2]、……、a[n]。例如:3,18,7,14,10,12,23,41,16,24。若存在0<i1<i2<i3< … < ie 且有a[i1]<=a[i2]<= … <=a[ie]则称为长度为e的不下降序列。如上例中3,18,23,24就是一个长度为4的不下降序列,同时也有3,7,10,12,16,24长度为6的不下降序列。 |
输入
|
第一行为n,表示序列中整数的个数,第二行n个数,两两之间用一个空格分隔。
|
输出
|
一个数,表示不下降子序列的最大长度(最长不下降序列数的个数)。
|
输入示例
|
5
12 22 13 6 13 |
输出示例
|
3
|
其他说明
|
数据范围:0<n<1000,其他输入数据均在int范围内。
|
1 #include<iostream> 2 using namespace std; 3 4 const int MAX_N=1000; 5 int b[MAX_N+10],aMaxLen[MAX_N+10]; 6 7 int main() 8 { 9 int i,j,N; 10 scanf("%d",&N); 11 for(i=1;i<=N;i++) scanf("%d",&b[i]); 12 aMaxLen[1]=1; 13 for(i=2;i<=N;i++) //求以第i个数为终点的最长上升子序列的长度 14 { 15 int nTmp=0; //记录第i个数左边子序列最大长度 16 for(j=1;j<i;j++) //搜索以第i 个数左边数为终点的最长上升子序列长度 17 { 18 if(b[i]>=b[j]) //后面的数比当前大 19 { 20 if(nTmp<aMaxLen[j]) nTmp=aMaxLen[j]; //替换成大的 21 } 22 } 23 aMaxLen[i]=nTmp+1; //总会比最前面的数小 24 } 25 int nMax=-1; 26 for(i=1;i<=N;i++) 27 if(nMax<aMaxLen[i]) nMax=aMaxLen[i]; 28 printf("%d ",nMax); 29 //system("pause"); 30 return 0; 31 } 32 33 34 /* 35 a b c m b 36 1 2 2 2 2 37 3 3 3 38 4 1 39 1 40 ------------ 41 1 2 3 4 3 42 * 43 后面的数与前面的所有数比较,大的话aMaxLen[i]+1;最后找最大。 44 */
主要是解题方法。弄懂之后倒不难。