リンク: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 ; }