タイトル説明
行列の特定の細胞におけるいくつかの家具を積み上げ、社交は、N行M列の行列であると思うかもしれない、他の人はオープンスペースです。ピアノは地面の上にスライドすることができますが、家具を打つか、宴会場の外にすることはできません、それ以外の場合は、ピアノや家具を損傷します、キャプテンは厳しい描きました。、ピアノは船体の摺動方向とする各時間は、グリッドは、隣接する東、西、南または北であってもよく、隣接する格子正方形に傾斜しています。そして、エミリーは魅了またはnoエンチャントするかを選択することができます:あなたは魔法、ピアノのスライドをしない場合は、うっとり場合は、ピアノが置いたままになります。
エミリーは天使である、彼女は各期間の船体の傾きを知っていました。1900は非常に満足するだけでなく、トニーの船酔いの治療を助長になるように、彼女は、社交でピアノができるだけ長く離れて滑空したいと考えています。しかし、エミリーはカウントされません、若すぎるので、私はあなたが彼女を助けることができると思います。
入力形式
入力ファイルの最初の行は5数N、M、X、Y、およびKを含んでいます そのような東[1,3]時間」として、我々は、時間間隔によって記載されて船体の傾き、および開始からの時間を算出し、サイズNとMは、ダンスホール、ピアノの初期位置に対するxとyを記載しましたチルト、[4、5]時間北チルト」、したがって、Kは切片の数を表します。
社交家具を記述するMの文字の次のN行、。「」文字i行の第j列がある場合、それはオープンスペースの位置ことを意味し、それは、 『X』は、家具である場合。
次の行K、Kの時間間隔の形式で、順に説明:SIのTIジ(1≤iはKを以下)。[SI、TI]船体を方向ディに傾斜している時間間隔を表します。DIは1、2、3、4、それぞれ北、南、西、東のために(マトリクスに対応する、下、右、左)です。入力部は、即ち、連続的であることを確実にするために、
S1 = 1、TI = SI-1 + 1(1 <iはKを以下)
TK = T
出力フォーマット
出力ファイルは、唯一のラインであるピアノの最長距離を滑空表す整数を含み(すなわち、グリッドの数)。
サンプル入力と出力
4 4 1 3 ..xx。 ..... ... X。 ..... 1 3 4 4 5 1 6 7 3
6
説明/ヒント
ピアノタクシー路線:
魔法かつて「×」の位置に天使のピアノ、スライド6の長さの合計。
[データ範囲]
データの50%、1≤N、M≤200、T≤200。
データの100%、1≤N、M≤200、K≤200、T≤40000。
タイトルの意味:、タイトルはあなたに無料の地図を提供することです、非常に明確に述べている障害物の「x」、ピアノ開始位置SX、SYがあり、あなたがすべき時刻t sでピアノを示すK入力を与えます「」。ピアノD方向にスライドさせ、しかし、あなたは、特定の時間にスライドされていない魔法を適用することができ、多くのピアノがグリッドにスライドアップすることができますどのようにあなたを求めます。
溶液:まず、DPまでの時間tを考える:F [ T] [ I] [ j]は、最も長い距離i行に利用可能な時間tのj列を示します。伝達方程式:F [ T] [ I]、[ J] = MAX(F [ T-1] [ I]、[ J]、F [ T] [ Iは*] [ J *] + 1)(私は*、J * )が、100%TLE及びMLEは、合理的な位置です。F [ように、それは、Kに、第1の時間間隔tを最適化しなければならないK] [ I]、[ J]私は位置間隔を惰行k番目のセグメントを表し、jは時間k番目のセグメントで得ることができる最長の距離に留意しましたあなただけ伝達方程式F [与えるために、(Xは間隔の長さ)×ステップの最大内の一方向に行くことができK] [ I]、[ J] = MAX(F [ K-1] [ I]、[ J]、F [ Kを] [ Iは、[] * jは*] + DIS(I、J、Iは、(I *は、j個*))このアプローチは、O(KN ^ 3)の合理的位置j *の時間複雑さを*)されていますタイムアウトは、Nインナー単調キューを離れて最適化するためにさらに最適化を必要とするとき(^ 2 KN)、ACとすることができ、このコードはまた、単調キューを減少させる最大値を選択することによって最適化されたアレイをスクロールするために使用されているが満たさO行うことができ必要に追加追加したときにキューを比較するクリアキューへの障害は、DISを相殺しました。
参照コード:
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 typedefの長い 長いLL。 #define PII対<整数、整数> の#define PIL対<整数、LL> の#define MKP make_pair の#define Fiの第一 の#define SE第二 のconst int型 INF = 0x3f3f3f3f 。 インラインint型リード() { int型のx = 0、F = 1。チャー CH = GETCHAR()。 一方、(CH < ' 0 ' || CH> ' 9 '){ 場合(CH == ' - ')、F = - 1 ; CH = GETCHAR();} 一方(CH> = ' 0 ' && CH <= ' 9 '){X =(X << 1)+(X << 3)+ CH- ' 0 ' ; CH = GETCHAR();} 戻りのx *のF。 } CONST INT MAXN = 210 。 PII Q [MAXN]。 INTのN、M、SX、TX、K、ANS、DP [MAXN] [MAXN]。 チャーG [MAXN] [MAXN]。 INT DX [ 5 ] = { 0、 -1、1、0、0 }、DY [ 5 ] = { 0、0、0、 - 1、1 }。 インラインボイドワーク(int型のx、int型の Y、INT LEN、INT D) { int型の L = 0、R = 0 。 以下のために(int型 I = 1であり、x> = 1 && X <= N && Y> = 1つの ; && Y <= M + I、X + = DX [D]、Y + = DY [D]) { 場合(G [X] [Yを] == "X ')L = R = 0 。 他 { 一方(L <R && Q [R- 1 ] .fi + IQ [R- 1 ] .SE <DP [X] [Y]) - R。 Q [R ++] = MKP(DP [X] [Y]、I)。 もし(Q [R- 1 ] .SE-Q [L]は.SE> LEN)++ L。 DP [X] [Y] = Q [L] .fi + I- Q [L] .SE。 ANS = MAX(ANS、DP [X] [Y])。 } } } int型のmain() { N =(読み取り); M =読み取る(); SX =(読み取り); TX =読み取る(); Kは、= 読み取ります(); 以下のための(int型i = 1 ; iが<= N; ++ I)のscanf(" %sの"、G [I] + 1 )。 memsetの(DP、 -INF、はsizeof DP)。 DP [SX] [TX] = 0 ; 用(INT J = 1 ; J <= K; ++ J) { int型、S、T、D、lenの; S =)は(読み込み; Tは読み取り=(); D = 読み取ります()。 LEN = T-S + 1 。 もし(Dの== 1)のための(int型 I = 1 ; I <= M; ++ I)の仕事(N、I、LEN、D)。 もし(D == 2)のためには、(int型、I = 1 ; I <= M; ++ i)は、(動作1 、I、LEN、D)。 もし(Dの== 3)のための(int型 I = 1 ; ++; iが<= N I)(D、I、M、LEN)作業; もし(Dの== 4)のための(int型 i = 1 ; iは++; iが<= N)(I、動作1 、LEN、D)。 } のprintf(" %d個の\ n " 、ANS)。 リターン 0 ; }