タイトル説明
リトル新しいは、単純なコンピュータゲームをプレイしています。
ゲームがある環状道路、道路を有する N- n型ロボット植物が短い道路で接続された2台の隣接するロボット間の植物は、。出発点として小さなロボット、これらの時計回りの順序で新しい工場 N- n番目のロボット工場番号1-N- 1 - N-、道路が円形であるのでため、最初のn n番目のロボット工場と1 ロボット植物は、一緒に道路の部分によって接続されています。新しいロボット工場にも番号が付けられて道路の小さな接続n個の 1-N 1 - n及び所定の第一のI iはi番目の道路とロボット工場に接続ビン 。私は1 + iが+ 1台の工場ロボット(1≦Iを≦ - 1 N 1 ≤ Iは≤ N - 1)の n個の道路のセグメント最初のn個の接続 のn 工場やロボットnは1。ロボット工場。
ゲーム中に、単位時間当たり、各番号は、道路上のいくつかの金貨を表示され、金コインは、時間の経過とともに変化することであり、時間の異なる単位のコインの数が異なっていてもよい道路の同じ時期に起こります。私たちは、道路上の金のコインを収集するために、小さな新しいロボットを助けが必要です。ロボットは、それは、単位時間当たりに一度移動する円形の道に沿って時計回りに歩かなければならないであろう、ロボットが一旦購入され、工場出荷時のロボットを購入するコインの所望の数に使用されなければならない、すなわちロボットから植物相現在位置に到達しますO次ロボット工場、及び小さな新しい道路のすべての硬貨は、例えば、小さな新しいに後に収集I I(≦iがn≦ 1 ≤ Iは≤ N-)号ロボット工場は、ロボットのロボットを購入し私がしますから、 私が最初に通過します、道路上を時計回りに旅行し、番号iロボット工場を開始I I道路番号、到着 I + 1つの、私は+ 場合(1ロボット工場 私は= N- 私は= N-を、ロボットが最初に到達します1 ロボット工場)、そして私は、番号i上の小さな新しい道にすべての金のコインを収集。ゲームではなく、環状道路上に共存する2 2又は 2 二つ以上のロボットを有し、各ロボットは、環状への道を歩くことができるP P回。小さな購入新しいロボットは、ロボットが歩行の数を設定する必要がありますが、実行している時間が可能 1〜P1 Pとの間の任意の整数。回数ロボットは完全に指定離れて行く道の上を歩くした場合、直ちに新しい小型ロボット工場に新しいロボットを購入する必要があり、ロボットは、新たな歩行の新しい番号に設定されています。
ここでは、ゲームのいくつかの追加の説明は、次のとおりです。
-
小さなロボットが開始を購入する最初の時間のための新しいゲーム。
-
ロボットを歩くと、購入ロボットの数を設定することは時間のかかるずに、瞬間的です。
-
ロボットとロボットの歩行の購入ロボットが歩くときに、2つの別々のプロセスがロボットを購入することはできませんされているが、ロボットの購入を完了し、ロボットが歩くようにロボットの数を設定した後に歩きます。
-
同じロボット工場ロボット買いに過ごしたことは同じですが、異なるロボット工場でロボットを購入するコストは必ずしも同じではありません。
-
ゲームの過程で進めることができないゲームにつながったロボットを購入しないで、原因新しい小さな金の不足のために心配する必要はありませんので、ゲーム終了時に費やした金のロボットを購入し、その後、控除金貨の新しいコレクションの増加となりました。このため、ゲームの終了後に、集められたコインの数が負であってもよいです。
今、単位時間あたりのコイン数は、道路に登場し、ロボットが費やす必要が各ロボット工場内の各セグメントを知ら買う、あなたがした後、少し新しい伝える メートル、小さな新しいロボットを購入するコストを控除した後、m個の時間単位後金貨の数を収集するまで。
入力形式
最初の行 3つの3つの正の整数でN-、M、PのN- 、M 、被験者の意味としてP、。
次のn のn行、各列を有する m個のM i行目の記述二つの整数のそれぞれとの間の空間によって分離された正の整数、
説明 Iのコインの数は、各単位道路番号iの時間で起こる(1≦ 1つのコインの≤数≦100 ≤ 1 0 0)、すなわち I I線に J J(1≤j≤m 。1 ≤ J ≤ mは)の数を表し j個のコインの数は、時間iにおけるj番目のユニットの道路番号に表示されます。
最後の行がある N- N-整数、二つの整数であって、前記第一との間の空間によって分離された各I iは数表しiは後でロボットのコインの数(Iロボット工場号かかり1≦ 1 ≤コインの数≤100 ≤ 1 0 0)。
出力フォーマット
含む総ライン、1 表す整数Mを時間のM単位は、ロボットは、後で差し引かれ
コインを過ごした後、新しいアップの数が少ないコインを収集します。
サンプル入力と出力
2 3 2 1 2 3 2 3 4 1 2
5
説明/ヒント
[データ範囲]
データの40%について2≤n≤40,1≤m≤40 2 ≤ N- ≤ 4 0 、1 ≤ M ≤ 。4 0。
データの90%、2≤n≤200,1≤m≤200 2 ≤ N- ≤ 2 0 0 、1 ≤ M ≤ 2 0 0。
データの100%、に2≤n≤1000,1≤m≤1000,1≤p≤m 2 ≤ N- ≤ 1。0 0 0 、1 ≤ m個の≤ 1 0 0 0 、1 ≤ P ≤のM。
NOIP 2009ユニバーサルグループ第四のタイトル
分析:最大コインを考慮:このリングのために、最初のオープン破る検討し、2 * nの列の長さに彼を置きます。
メンテナンスメソッドの状態を考慮してください最初、ロボット現在工場こと座標位置を維持します。
第二に、それは現在の時刻を維持する必要があります。その後も格納コインの数は、いくつかの手順のPロボットあります
DP [I] [j]はjで表すように配置工場時刻iにおける硬貨の最大数に達しました。
オーバー旧1-Pの植物から転送されてもよいDP [i]の[j]は、のために!
即:DP [I] [J] = MAX(DP [I-1] [J-1]、DP [I-2] [J-2]、DP [I-3] [J-3]、.. .DP [IP] [JP])+お金[I] [J]。
そして、初期化を検討:DP [1] [j]はお金を= [J] [1] [j]を-COST。
その他の初期設定は0です。
(エラー!)
正解:https://www.luogu.org/problemnew/solution/P1070
/ *
[I] [j]は、i番目の時点でJ到着硬貨の最大数を設定F 1;
R&LT [i] [j]は、植物のi番目の到着時間のj番目の値を表し、
SUM [I ] [j]は、プレフィックス値を示し、それが工場iとjの時に金貨の数に到達することです!
そこに2時間の制約や植物の量があり、二次元の接頭辞を使用する必要があるので!
和[I] [J] -sum [I-1] [J-1] = R [I] [J];
これは、実際には、各リード、及びプレフィックスが同一の対角に加算更新される維持配列!
そうするため:[i]の総和[J] -sum [IK] [JK] と等価である:R IK + 1] [ JK + 1] + R [IK + 2] [JK +2]
+ ... + R [I] [J]、すなわち:次に、より長い時間k、T分に行き、時間的にJKのIK工場後に行く
ので、電流値がRに対応すべきです[1- K + T] [JK + T ];
一度離れたIK JKから始まるから蓄積開始に相当、時間kまで、私はで来る
に得ることができる最大値!
* /
の#include <cstdioを>
する#include <アルゴリズム>
使用して名前空間STD;
int型N-、M、P;
int型SUM [1002] [1002]は、R [1002] [1002]、コスト[1002]、[1002] DP。
INT最大インライン(Xはint、int型Y)
{
X> Y X :? Yを返す;
}
インラインINTリード()
{
チャーCH;
ながら((CH = GETCHAR())< '0' || CH> '9' );
INT RES = CH-'0 ';
一方、((CH = GETCHAR())> =' 0' && CH <= '9' )
RES =のRES * 10 + CH-'0';
RESを返す;
}
(INTメイン)
{
int型T;
N- =読む()、M =読む()は、P =読む();
(用I = 1 int型;私は<= N;私は++)// j番目のパスのタイミングでコインのi番目の数を読んでください!
(; J INT J = 1 <= M; J ++ //) 。I = Nは、N-連結されている場合はIとI + 1、i番目の道路リンクを定義> 1;
{
scanfの( "%のD"、&R&LTは[ I] [J]); //
}
ための(I 1 = int型; I <= N; Iは++)//各製造工場は、ロボット消費読み取る
のscanf( "%dの"、およびコストを[I]); //
以下のために(INT i = 1; iが <= M; iは++)// DPを初期化する[I]配列は、最小値である
{//
DP [I] = - 1E9; //
}
INT ANS。
{
ANS = -COST [J] + DP [-I 1]; // DP [-I 1] maxは、特定の特性が最適下部満たすために瞬間での値である
(int型のk = 0; K <P && I + Kを<= Mであり、k ++)//すべての散歩DPに対して行わ
{
T = J + K> N-(J + K)%N- :? J + K; //リングのが処理される
ANS + = R [T] [I + K]; //プラスiの値がK + tは時間が行ったある
DPを[I + K] =最大 (DP [I + k]は、ANS); // 最大値を取得します!
}
}
のprintf( "%のD"、DP [M]); //最大出力値!
0リターン;
}