POJ 1661暴力DP

ちょっと質問の意味。

アイデア:

非常に興味深い質問は、私は自動更新モード不明な点、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 = 0INT R = 0INT 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 
* /

 

おすすめ

転載: www.cnblogs.com/tiberius/p/11259537.html