ちょっと質問の意味。
アイデア:
非常に興味深い質問は、私は自動更新モード不明な点、DPするために、そのブラシテーブル方式を使用していました。
我々は全体の経路が横方向および長手方向の動きに分割されて置くことができ、被験者は、長手方向移動距離であり、高い開始ジミーを与えます。
私たちの目標は、各セグメントエンドポイントの最小横方向の動きをDPすることです。
小さなトリックがあり、ジミーは、それが地面に落ちるに開始する可能性がある、必要はありませんか秋に何のインターバルストップはありません。
を伴うコード:
#include <iostreamの> する#include <アルゴリズム> の#include <cstdioを> する#include <CStringの> 使用して 名前空間STD。 const int型 MAXN = 1005 ; const int型 INF = 0x3f3f3f3f 。 const int型 Fは= 0x3fをします。 構造体セグメント{ int型のL、R、H。 セグメント(INTは L = 0、INT R = 0、INT H = 0 ){ この - > L = L、本- > R = R、この - > H = H; } }。 セグメント・ストア[MAXN]。 INT DP [MAXN << 1 ]、N、X、H、MAX、T。 BOOL [MAXN <<覆わ1 ]。 BOOL CMP(CONSTセグメント&S0、CONSTセグメント&S1){ 戻り s0.h> s1.h。 } BOOL inSegment(int型のx、セグメントS){ 戻り SL <= X && X <= SR。 } int型のmain(){ scanf関数(" %のD "、&T)。 しばらく(t--){ scanf関数(" %D%D%D%D "、&N、&X、&H&MAX)。 以下のために(int型私= 0 ; iがNを<; ++ i)は、scanf関数(" %D%D%D "、および店舗[I] .L&格納[I] .R&店舗[I]・H)。 memsetの(DP、F、はsizeof (DP))。 memsetの(カバーされ、偽の、はsizeof (カバー)); ソート(店舗、店舗 + N、CMP)。 INT ANS = H、LFT、RHT、LP、RP、nlft、nrht、NLP、NRP。 以下のために(int型 = Iを0 ; iがNを<; ++ I){ LFT = I << 1、RHT = LFT + 1 。 もし(inSegment(X、店舗[I])){ DP [LFT] = X -店舗[I] .L、DP [RHT] =ストア[I] .R - X。 破ります; } } のために(int型 i = 0 ; iがNを<; ++ I){ LFT = I << 1、RHT = LFT + 1 。 LP =店舗[I] .L、RP = ストア[I] .R。 int型 CNT0 = 0、CNT1 = 0 ; もし(DP [LFT] == INF)続け; 用(int型 J = I + 1 ;・H [i]を格納する-ストア[J]・H <= MAX && J <N && CNT0 + CNT1 < 2 ; ++ J){ 場合(ストア[I]・H = =店舗[J] .H)続けます。 nlft = J << 1、nrht = nlft + 1 。 NLP =店舗[J] .L、NRP = ストア[J] .R。 もし(!CNT0 && inSegment(LP、店舗[J])){ DP [nlft] =分(DP [nlft]、DP [LFT] + LP - NLP)。 DP [nrht]=分(DP [nrht]、DP [LFT] + NRP - LP)。 CNT0 = 1 。 } であれば(CNT1 &&!{inSegment(RP、店舗[J])) DP [nlft] =分(DP [nlft]、DP [RHT] + RP - NLP)。 DP [nrht] =分(DP [nrht]、DP [RHT] + NRP - RP)。 CNT1 = 1 。 } } } のために(int型 i = 0 ; iは<Nを; ++ I){ 場合(ストア[I]・H> MAX)続けます。 にとって(int型J = I + 1、J <N; ++ J){ 場合(inSegment(店舗[I] .L、店舗[J]))被覆は、[I << 1 ] = 真。 もし(inSegment(ストア[I] .R、店舗[J]))カバー[I << 1 | 1 ] = 真。 } } int型ミネソタ= INF。 用(int型 - I = N 1 ; I> = 0 - ; &&店[I]・H <= MAX {I) LFT = I << 1、RHT = LFT + 1 。 もし(!覆わ[LFT])、A = 分(DP [LFT])。 OW(!覆わ[RHT])、A = 分(DP [RHT])。 } オウ(== INF)A = 0 。 ANS + = A。 printf(" %d個の\ nを" 、ANS) } 戻り 0 。 } / * 1 3 4 4 3 5 3 1 2 7 2 6 1 * /