zoukankan      html  css  js  c++  java
  • poj3671

    首先容易想到的是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
  • 相关阅读:
    python中字典排序,列表中的字典排序
    Python模块:operator简单介绍
    java 物理资源回收 finally与try
    Eclipse相对路径
    java Lambda
    java 匿名内部类
    java File类
    java单例类
    java 创建子类
    jvm运行时数据区域
  • 原文地址:https://www.cnblogs.com/phile/p/4473305.html
Copyright © 2011-2022 走看看