博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

最长递增子序列

Posted on 2010-10-20 11:17  桃子在路上  阅读(3776)  评论(0编辑  收藏  举报

【最长递增子序列】
    给定数列A1,A2,...An,求最长递增子序列
输入:
    第一行一个整数n,表示有n个数(n<=1000)
    第二行n个整数,用空格隔开。
输出:
    最长递增子序列长度。

【分析】
     在求以Ai为末元素的最长递增子序列时,找到所有序号在Ai前面且小于Ai的元素Aj,即j<i且Aj<Ai。如果这样的元素存在,那么对所有Aj,都有一个以Aj为末元素的最长递增子序列的长度S(j),把其中最大的S(j)选出来,那么S(i)就等于最大的S(j)加上1,即以Ai为末元素的最长递增子序列,等于以使S(j)最大的那个Aj为末元素的递增子序列最末再加上Ai;如果这样的元素不存在,那么Ai自身构成一个长度为1的以Ai为末元素的递增子序列。
    阶段i:以第i个数为末元素
    状态S[i]:以第i个数为末元素的可能递增序列长度
    转移方程:S[i+1]←max{S[i]}+1
【算法】
    S[1]:=1;                   {以第一个元素为末元素的递增序列长度肯定是1}
    For i←2 to n do
      For j←1 to i-1 do
        Begin
          搜索A[i]前面比A[i]小的数A[j],得到对应的S[j];
          S[i]←max{S[j]}+1;
        End;
    Write(max{S[i]});


【参考程序】

Program dizeng;
const
  max=1000;
var
  i,j,n,t,maxs:longint;
  a,s:array[1..max] of longint;
begin
  readln(n);
  for i:=1 to n do
    read(a[i]);
  s[1]:=1;
  for i:=2 to n do
   begin
    maxs:=0;
    for j:=1 to i-1 do
      if a[j]<a[i] then if maxs<s[j] then maxs:=s[j];
    s[i]:=maxs+1;
   end;
  maxs:=0;
  for i:=1 to n do
    if maxs<s[i] then maxs:=s[i];
  write(maxs);
end.