POJ1821フェンス(モノトーンキュー)

/ * 
    設計条件F [i]の[j]はフロントI〜J EX-火を示し、その後、転送
    発見部分をキューによって単調減少の複雑さを維持することができます
* / 
書式#include <iostreamの> 
の#include <キュー> 
書式#include <地図> 
の#include <ベクトル> 
の#include <cstdioを> 
する#include <アルゴリズム> 
の#include <スタック> 
の#include <CStringの>
 使用して 名前空間STD; 
typedefの長い ロングLL、
 CONST  INT N = 1E5 + 7。 CONST  INT INF = 0x3f3f3f3f ;
 INT N- 、K;
 構造体ノード{
     INTL、P、S。
} S [N]。
INTのQ [N]。
INT F [ 110 ] [ 16100 ]。
ブールCMP(ノードA、ノードB){
     リターン <などBS。
} 
int型のmain(){ 
    CIN >> N >> K。
    int型私は、
    以下のための式(I = 1 ; I <= kは、I ++ ){ 
      CIN >> S [i]は.L >> S [i]は.P >> S [i]は.S。
    } 
    ソート(S + 1、S + 1 + K、CMP)。
    int型J; 
    memsetの(F、0はsizeof F)。
    INT HH = 0 ;
     int型 TT = - 1。;
     のために(私は= 1 ; I <= Kは、I ++ ){ 
        HH = 0 ; 
        TT = 0 ; 
        Q [ 0 ] = 0 ; // キュー0の先頭、現在のみ正当状態
        (Jは、= 。1 ; J <= N-J ++ ){ 
            F [I] [J] = MAX(F [I- 1 ] [J]、F [I]、[J- 1 ]); // これは大工ではありませんブラシケース
            IF(J> = S [I] .S + S [I] .L)// 作業者の正面には、ボードの裏面にも適用することができるので、コーティングは、以下であるが、壊れることができないで
                続行します;
             一方(HH <&& TT = Q [HH] + S [I] .L <J)// それが被覆除去するのに必要な範囲超える場合 
                HH ++をIF(J <S [I] .S){ // 可能キュー
                INT TMP = F [I- 1 ] [J] -s [I] .P * J、
                 一方(HH <TT = F && [I- 1 ] [Q [TT] - S [I] .P Q * [TT] < TMP)
                    TT - ; 
                Q [ ++ TT] = J;
                 続行; 
            } 
            F [I] [J] = MAX(F [I]、[J]、F [I- 1 ] [Q [HH] + S [I] .P *(J- Q [HH])); 
        }
    } 
    COUT<< F [k]は[N] << ENDL。
}
コードの表示

コードの説明を見てください

おすすめ

転載: www.cnblogs.com/ctyakwf/p/12454694.html