6053:ローレンス
合計提出は:9テストは合格:6
説明
TEロレンスは、第一次世界大戦中に彼の論争の人物だったアラビアの劇場で提供していますし、オスマン帝国に対するゲリラ攻撃にアラブ国民のグループを率いて英国の将校でした。彼の主なターゲットは、鉄道でした。彼の功績の非常に小説版が大ヒット映画「アラビアのロレンス」で発表されました。
あなたは最高に彼の限られた資源をどのように使用するかを助けるローレンス・フィギュアにプログラムを書くことです。あなたは、英国のインテリジェンスからいくつかの情報を持っています。まず、レールラインには枝、無拍車がない完全---線形です。次に、英国Intelligenceは1〜100 Aデポーは、独自には有用であることが他のデポに接続されている場合、それが唯一の値を有する---各デポの整数を戦略的重要性を割り当てました。全体鉄道の戦略的価値は、レール線によって、直接または間接的に接続されているデポのすべてのペアの戦略値の積を加算することによって計算されます。この鉄道を考えてみましょう:
その戦略的価値は* 2 * 1 * 2 * 1 4 * 5 + 4 + 4 + 5 + 5 + 1 * 2 = 49です。
さて、ローレンスは唯一の攻撃のための十分なリソースを持っていると仮定します。彼は、彼らがあまりにもよく守っている---デポ自身を攻撃することはできません。彼は砂漠の真ん中で、デポ間の鉄道路線を攻撃しなければなりません。ローレンスは、右の真ん中にこのレールラインを攻撃したらどうなるか考えてみましょう:
残り鉄道の戦略的な値は4 * 5 + 1 * 2 = 22でも、図4及び図5にデポ間のローレンス攻撃を考えます。
残りの鉄道の戦略的価値は、これはローレンスの最良の選択肢である5 * 1 + 5 * 2 + 1 * 2 = 17です。
鉄道の説明とローレンスが実行できる攻撃、彼はその鉄道のために達成できることを最小の戦略的価値を見つけ出すの数を考えます。
エントリー
複数のデータセットがあります。各データセットは2つの整数n及びmの行で始まります。N鉄道(1≤n≤1000)上のデポの数であり、mはローレンス(0≤m<N)のためのリソースを持っている攻撃の数です。次の行に順に各デポの戦略的な値を示す、ことnは整数で、1から100までの各う。入力の終了は、処理されるべきではないn = 0であり、m = 0の線でマークされます。
輸出
ローレンスは、彼の攻撃に達成できること鉄道のための最小戦略値を示す各データセット、出力単一の整数、のために。出力独自の行の各整数。
サンプル入力
4 1
4 5 1 2
4 2
4 5 1 2
0 0
サンプル出力
17
2
問題解決のアイデア:タイトルは、ほぼ四角形不平等+最適化であることを山と構築された小学校の思考!
1の#include <ビット/ STDC ++ H> 2 の#define長い長llの 3 使用して 名前空間STDを、 4 5 インライン読み取り11(){ 6 LL X = 0、F = 1 。 7 チャー CH = GETCHAR()。 8 一方(CH < ' 0 ' || CH> ' 9 ' ){ 9 もし(CH == ' - ')、F = - 1 。 10 CH = GETCHAR()。 11 } 12 ながら(CH> = ' 0 ' && CH <= ' 9 ' ){ 13 、X =(X << 1)+(X << 3)+(CH ^ 48 )。 14 CH = GETCHAR()。 15 } 16 リターン X * F。 17 } 18 19インラインボイドライト(LL X){ 20 であれば(X < 0 ){ 21 のputchar(' - ' )。 22 X = - X。 23 } 24 IF(X> 9 ){ 25 書き込み(X / 10 ); 26である } 27 (X%でのputchar 10 + ' 0 ' ); 28 } 29 30 INT N-、M; 31である CONST INT MAXN = 1005 ; 32 CONST LL INF = 0x3f3f3f3f3f3f3f3f ; 33である LL W [MAXN] [MAXN]、DP [MAXN] [MAXN]、POS [MAXN] [MAXN]; // DP [i] [j]は最小セグメントに、iのj番目の値の前に意味を表す 34である LL SUM1 [MAXN]、SUM2 [MAXN]、ARR [MAXN]; 35 36 LLのjudgc(A LL、LL B){ 37 リターン((SUM1 -sum1 [B] [A- 1)] *(SUM1 -sum1 [B] [A- 1)〕 - (SUM2 -sum2 [B] [A- 1)])/ 2 。 38 } 39 40 INT メイン(){ 41 ながら(scanf関数(" %D%D "、&N、&M)、N || M){ 42 M ++ 。 43 のために(INT iは= 1 ; iが<= N; I ++ ){ 44 ARR [I] = )(読み取ります。 45 SUM1 [I] = SUM1 [I- 1 ] + ARR [I]。 46 SUM2 [I] = SUM2 [I- 1 ] + ARR [I] * ARR [I]; 47 } 48 のmemset(DP、INF、はsizeof (DP)); 49 のために(INT I = 1 ; I <= N; I ++)DP [ 1。 [I] = judgc(] 1。、I)、POS [ 1。 [I] =] 1。; 50 用(INT I = 2 ;私は= M <; I ++){ // 片 51は、 POS [ I] N- [+ 1 ] = N-; // 境界の境界の判定分割線 52である ため(INT J = N-; J> = I、J、){ 53 のための(int型 K = POS [I- 1 ] [j]は、K <= POS [I]、[J + 1 ]; K ++ ){ 54 であれば(DP [I] [J]> DP [I- 1 ] [K ] + judgc(K + 1 、J)){ 55 、DP [I] [J] = DP [I- 1 ] [K] + judgc(K + 1 、J); 56台の POS [I] [J] = K。 57 } 58 } 59 } 60 } 61 // のための(INT iが= 1; I <= M; I ++){ 62 // のための(int型J = I; J <= nであり、j ++){ 63 // coutの<< I << "" << J << "" << DP [I] [J] <<てendl; 64 // } 65 // } 66 67 のprintf(" %のLLD \ n " 、DP [M] [N])。 68 } 69 リターン 0 。 70 }