洛谷 P1091 合唱队形

    xiaoxiao2021-03-26  19

    题目概述

        N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。

    合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK, 则他们的身高满足T1<...<Ti>Ti+1>…>TK(1<=i<=K)。

    你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。

        其中1<=n<=100

    解题思路

        首先,队形中一定会有一个同学身高最高,他之前的学生身高是一个递增序列,之后的学生身高是一个递减数列。求最少需要几位同学出列,就是求最长上升序列和最长下降序列,然后用总人数一减就可以了。注意每个人都可能是最高的那一个。

        时间复杂度:O(n^3)

        空间复杂度:O(n)

    源程序

    var  a,b:array[1..1000]of longint;  i,n,j,k,ans,now:longint; begin  readln(n);  for i:=1 to n do   read(a[i]);  for i:=1 to n do   begin    for j:=1 to n do     b[j]:=1;    now:=0;    for j:=1 to i do     for k:=1 to j-1 do      if (a[k]<a[j])and(b[k]+1>b[j]) then b[j]:=b[k]+1;    now:=now+b[i];    for j:=1 to n do     b[j]:=1;    for j:=n downto i do     for k:=n downto j+1 do      if (a[k]<a[j])and(b[k]+1>b[j]) then b[j]:=b[k]+1;    now:=now+b[i]-1;    if ans<now then ans:=now;   end;  write(ans); end.

    转载请注明原文地址: https://ju.6miu.com/read-658864.html

    最新回复(0)