/ * 設計条件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。 }
コードの説明を見てください