首先容易想到的是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.