冬のアルゴリズムベースキャンプ3 J-牛肉ポーオフ2020頭の牛はゴー(DP +フロイド)の夢を見ることができます

リンク:https://ac.nowcoder.com/acm/contest/3004/J

アイデア:

第flyodのDIS [I] [J]での前処理は、JポイントIからの最短距離を表しています

DP、DP開始後[i]が示す最大の戦闘効率を収穫表示されることがあり、i番目のウィザード

次いで、転写式得るために[I] DP [I] = MAX(DP DPする  [I]、DP [IJ] + [I] .val) Poはの発生のI jの番号の前に夢よい表します

これは複雑さがKである時間であろう2、我々は、地図上の任意の2点間の距離が200以上であることを確認することができ、それは複雑さO(200 * Kを減少させて、それだけで、200 Jの最大値とすることができます)

差が夢は、2つのポーを発生することができ、また決定される時間は、2点間の距離が同じであることがより大きいことに注意してください

書式#include <iostreamの> 
の#include <アルゴリズム> 
書式#include <CStringの>
  使用して 名前空間をSTD。
 typedefの長い 長いLL。
 const  int型 MAXN = 1E5 + 10 const  int型 INF = 0x3f3f3f3f INT DIS [ 205 ] [ 205 ]、N、M、U、V、K。
 LL ANS = 0 、DP [MAXN]。
 構造体POK {
      int型のT、POS、V。
 } [MAXN]。
 int型 CMP(POK BをPOK){ リターン <におけるBT;}
  ボイドフロイド()
 { 
      int型のk = 1 ; K <= N; ++ K)
         のためのINTは私= 1 ; I <= N ++ I)
             のためにINT J = 1 ; J <= N; ++ J)
                DIS [I] [J] =分(DIS [I]、[J]、DIS [I] [K] + DIS [K] [J])。
 } 
 int型のmain()
 { 
     scanf関数(" %D%D "、&​​N、&M)。
    以下のためにINT iが= 1 ; I <= N I ++ のためのINT J =1 ; J <= N; J ++ 
            DIS [I] [J] = I == J?0 :infファイル。
     以下のためにINT iが= 1 ; I <= M; I ++ ){ 
         scanf関数(" %D%D "、&​​U、およびV)。
         DIS [U] [V] = DIS [V] [U] = 1 
     } 
    )(フロイド。
    scanf関数(" %のD "、&K)。
    以下のためにINT iが= 1 ; I <= kは、I ++ 
        のscanf(" %D%D%D "、および[I] .T、および[I] .POS、& [I] .V)。 1、+ 1 + K、CMP)。
    [ 0 ] .T = 0、[ 0 ] .POS = 1、[ 0 ] .V = 0 以下のためにINT iが= 1 ; I <= K; I ++ ){ 
        DP [I] = - INF。
        INT J = 1 ; J <= 200 && I> = J; J ++ ){
             場合([i]が.ta [IJ] .T> = DIS [I] .POS] [[IJ ] .POS])
                DP [I] = MAX(DP [I]、DP [IJ] + [I] .V)。
        } 
        ANS = MAX(DP [i]は、ANS)。
    } 
    COUT << ANS << ENDL。
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/overrate-wsj/p/12292925.html