题目: | 合唱队形 | |
来源: | Noip2004T3 | |
题目大意: | N个数,剔除最少的人使之满足左开始越来越高知道一个数又开始越来越低。 | |
数据范围: | 2 <= N <= 100 | |
样例: | 8 186 186 150 200 160 130 197 220 | 4 |
做题思路: | 当初做这题时wrong的好疯狂,竟然忘了输出的是n-ans,样例输出ans-1也对坑 啊。。。。 该题就是正着倒着各一遍最长上升,然后枚举最高点然后n-ans为答案 | |
知识点: | 动态规划 |
var
f1,f2,a:array[0..110]of longint;
i,j,n,ans:longint;
begin
readln(n);
fori:=1 to n do
begin
read(a[i]);
f1[i]:=1;{<初始化每个点为开始的最长上升皆为1>}
f2[i]:=1;
end;
fori:=2 to n do
forj:=1 to i-1 do
if(a[i]>a[j])and(f1[j]+1>f1[i]) then f1[i]:=f1[j]+1;
fori:=n-1 downto 1 do
forj:=n downto i+1 do
if(a[i]>a[j])and(f2[j]+1>f2[i]) then f2[i]:=f2[j]+1;
ans:=0;
fori:=1 to n do
iff1[i]+f2[i]>ans then ans:=f1[i]+f2[i];
writeln(n-ans+1);{<ans-1是因为每次最长都会算上最高点,所以最高点被算了两次>}
end.
题目来源:
http://yuanti.tyvj.cn:8080/Problem_Show.asp?id=1048