最长不下降序列

最长不下降序列

最长不下降序列

Time Limit:1000MS  Memory Limit:65536K
Total Submit:488 Accepted:197

Description

有由n个不相同的整数组成的数列,记为a(1)、a(2)、...a(n),当i!=j时,a(i)!=a(j)。若存在i1 < i2 < i3 < ... < ie,且有a(i1) < a(i2) < ... < a(ie), 则称为长度为e的不下降序列。
如 3,18,7,14,10,12,23,41,16,24
则有3,18,23,24是一个长度为4的不下降子序列
3,7,10,12,23,24是长度为6的不下降子序列。
现要求你求最长的不下降子序列。

Input

多组测试数据
每组一行,先输入一个数列长度n (1 <= n <= 1000),然后是n个整数
处理到文件末尾

Output

输出最长不下降子序列的长度

Sample Input

10 3 18 7 14 10 12 23 41 16 24

 

Sample Output

6
         简单动态规划题,给予我们一种思想!!
代码如下:

   
  
  
  
#include < stdio.h >
int  Longest_Increasing( int  num[], int  List[], int  n) // List[i]为包含i项在内的最长不下降子序列
{
    
int i,j;
    
for(i=1;i<n;i++)
    
{
        
for(j=0;j<i;j++)
        
{
            
if(num[i]>num[j]&&List[i]<List[j]+1)
                    List[i]
=List[j]+1;
        }

    }

    
return 0;
}


int  main()
{
    
int n,i,ans;
    
int num[1001],List[1001];
    
while(scanf("%d",&n)!=EOF)
    
{
        
for(i=0;i<n;i++)
        
{
            List[i]
=1;
            scanf(
"%d",&num[i]);
        }


        Longest_Increasing(num,List,n);
        
/**//*        printf("最优解:\n");
        for(i=0;i<n;i++)
            printf("%d ",List[i]);
        printf("\n");
*/


        ans
=0;
        
for(i=0;i<n;i++)
            
if(List[i]>ans)
                ans
=List[i];

        printf(
"%d\n",ans);
    }

    
return 0;
}

你可能感兴趣的:(最长不下降序列)