首先容易想到的是LIS,但是n<=30000,所以肯定要优化;

壮哉单调队列又登场了;

然后再找一个最长不上升序列并求两者最大值即可,复杂度O(n logn);

应该说这是解题通法了,但再回头看题目,这道题中,1<=di<=3这个条件没有用

于是很容易想到,还是以最长不下降序列为例:

明显序列结尾元素只有3种可能:以1开头,以2开头,以3开头(全是3);

设d[1],d[2],d[3]代表上述3种可能;

则从后往前,对于当前数t,d[t]=max{d[t],d[k]+1} (t<=k<=3)

则复杂度优化为O(n);

 1 var d:array[0..10] of longint;
 2     a:array[0..40000] of integer;
 3     n,i,t,j:longint;
 4 function max(a,b:longint):longint;
 5   begin
 6     if a>b then max:=a else max:=b;
 7   end;
 8 
 9 begin
10   readln(n);
11   for i:=1 to n do
12     readln(a[i]);
13   for i:=n downto 1 do
14   begin
15     t:=a[i];
16     for j:=t to 2 do
17       d[t]:=max(d[t],d[j]+1);
18   end;
19   writeln(n-max(d[1],d[2]));
20 end.
View Code

 

posted on 2013-12-06 23:25  acphile  阅读(133)  评论(0编辑  收藏  举报