[タイトル]効果
L-位置(1〜L番号)とN要件、それぞれ三のスタッフ1,2,3位置、P [I]を得るために必要なそれぞれの位置の初期状態では、位置は、ウェイターに行く必要がありますそれは、iがjのコストを配置する位置から知られている最小コストを見つけ、C [I] [J]です。
[解析]アイデア
我々は、F [i]は、[X] [Y]は、[z]は、前の請求項のi番目の完了三の最小コスト付随それぞれx、y、zの位置を示します。その後、我々は、ウェイターはi番目によって必要とされる位置になければならない場合、すなわち、Z = P [i]は、それが一次元アレイで除去することができる、ことを見出しました。
次に、伝達方程式を見て、I + 1最初の要件のために、3例があり、すなわち、位置Pまでウェイターへのx、y座標[I + 1]が、それによって得られるP [I]を、ましょう。
$ [I + 1] [X] [Y] =分(F [I + 1] [X] [Y] F(X!= P [I + 1]且Y!= P [I + 1])であれば、F [i]は、[X] [Y] + C [P [I] [P [I + 1]])$
$ IF(P [I]!= Pの[I + 1]且Y!= P [I + 1])F [I + 1] [P [I] [Y] =分(F [I + 1] [I] [X] [Y] + C [X] [P [I + 1]])$ F [P [I] [Y]、
$ [I + 1] [X] [P [I] [I + 1] F =分(F(X!= P [I + 1]且P [I]!= P [I + 1])であれば[X] [P [I]、F [i]が[X] [Y] + C [Y] [Pの[I + 1]])$
伝達方程式を観察することによって、私たちは、あなたがコードに詳述された空間の爆発を防止するには、スクロール配列を使用することができますので、すべての状態は唯一、その前の状態に関係していることがわかります。
[]コードの実装
1の#include <cstdioを> 2の#include <CStringの> 3の#include <アルゴリズム> 4 の#define RGレジスタ 5 の#defineゴー(I、B)(RG iは= int型、iが= Bを<; I ++の)のための 6 使用して 名前空間はstdを、 7 INT T、L、N、C [ 202 ] [ 202 ]、p個の[ 1002 ]。 8 int型 F [ 2 ] [ 202 ] [ 202 ]。 9つの int型のANS; 10 のconst int型 MAXN = 1E9 + 7 。 11 INT メイン(){ 12 のscanf(" %dの"、&T)。 13 INT X、Y。 14 一方(T-- ){ 15の ANS = 1 << 30 。 16 のscanf(" %D%dの"、&L、&N) 17 ゴー(I、1、L)に行く(j、1、L)のscanf(" %dの"、&C [I] [J])。 18 ゴー(I、1、N)のscanf(" %dの"、&P [I])。 19 のmemset(F、0x3F、はsizeof (F))、 20は F [ 0 ] [ 1 ] [ 2 ] = 0 ; P [ 0 ] = 3 ; 21は、 移動(K、0、N- 1 ){ 22は = A ^ 1。 ; // XORによって実装スクロールアレイ 23で のmemset(F [A] は0x3F、はsizeof(Fは、[A])); // の初期値を更新することを忘れない 24 X = P [K]、Y = P [K + 1 ]; 25 ゴー( I、1、L)ゴー(J、1 、L){ 26 あれば(私== j)は継続します。 27 なら(I!= Y && J!= Y)F [A] [I]、[J] =分(F [A] [I]、[J]、F [A ^ 1 ] [I] [J] + Cの[ X] [Y])。 28 であれば、[A] [X] [J] =分(F [A] [X] [j]は、[A ^ F F(X!= Y && J!= Y)1 ] [I] [J] + [C I] [Y])。 29 もし [I] [X]、[A ^ F(I!= Y && X!= Y)[A] F [i]が[X] =分(F [A] 1 [I] [J] +] C [ J] [Y])。 30 } 31 } 32 ゴー(I、1、L)に行く(j、1 、L) 33 であれば(私!= jの&& I] = P [N] && J!= P [N]) 34 ANS =分(ANS、F [A] [I] [J])。 35 のprintf(" %d個の\ n " 、ANS)。 36 } 37 リターン 0 。 38 }