オリジナルタイトル
トピック分析
均等に追いつくためにそれを変更し、単調ではない作るために、i番目の山腹を検討するために、すべての最初のビット難しいDPは、等しいと次にそれを作ることです、値が元の値の一連の後に変更する必要がありますそれはBになる考慮して、B [i]は、各配列のため、元の数であるように、最初の[i]は、そのようなものである、昇順に増分、最初のプロ配列の行を考えます最小のコストは、そのようなDP、DPを配置することができる[i] [j]は変更される電流を表し、i番目の値である.DP次のように、それが必要とされる最小コストB [J]になり、更新は、[I] [J =分(DP [I-1] [K])(0 <= K <= j)は、最小値を見つけるために、DP [N] [j]を掃引することがANSであるとすると、シーケンスをデクリメント再び更新、単にB [i]は同じ操作を実行し、最小値を見つけるために降順で行目DPから回答[n]は[J]とANSである。トピックデータのみを考慮するのに十分に強くありません増分は前にできるようになります。
コード
1の#include <iostreamの> 2の#include <アルゴリズム> 3の#include <ユーティリティ> 4の#include <cstdioを> 5の#include <cmath> 6の#include <CStringの> 7の#include < ストリング > 8の#include <ベクトル> 9# <積層体>含む 10の#include <キュー> 11の#include <地図> 12 <の#include 設定 > 13 14 使って 名前空間STDを、 15 typedefの長い 長いLL。 INF_INT = 0x3f3f3f3f 。 17 CONST LL INF_LL = 0x3f3f3f3f3f3f3f3f 。 18 19 INT [ 3000 ]、B [ 3000 ]。 20 int型 DP [ 3000 ]。 21 22 のint main()の 23 { 24 // freopenは( "black.in"、 "R"、STDIN)。 25 // freopenは( "black.out"、 "W"、STDOUT)。 26 INT N。 27 CIN >> N。 28 のためには、(int型、I = 1(scanf関数をiは++; iがn = <)" %のD "、および[I])、[I] = B [i]は、 29 ソート(B + 1、B + 1 + N)。 30 のために(int型 i = 1 ; iが<= N; iが++ ) 31 { 32 INTミネソタ= INF_INT。 33 のための(int型 J = 1 ; J <= N; J ++ ) 34 { 35 であれば(I == 1)DP [J] = ABS(B [J] - [I])。 36 他の 37 { 38 ミネソタ州=分(DP [J]、ミネソタ州)。 39 DP [J] =ミネソタ+ ABS(B [J] - [I])。 40 } 41 } 42 } 43 INT ANS = INF_INT。 44 のためには、(int型 i = 1 ; iが<= N; iが++)ANS = 分(ANS、DP [I])。 45 ソート(B + 1、B + 1 + N、大きな< INT > ()); 46 のために(int型 i = 1 ; iが<= N; iが++ ) 47 { 48 INTミネソタ= INF_INT。 49 用(INTの J = 1 ; J <= N; J ++ ) 50 { 51 であれば(I == 1)DP [J] = ABS(B [J] - [I])。 52 他の 53 { 54 ミネソタ州= 分(DP [J]、ミネソタ州)。 55 DP [J] =ミネソタ+ ABS(B [J] - [I])。 56 } 57 } 58 } 59 のための(int型 i = 1 ; iが<= N; iが++)ANS = 分(ANS、DP [I])。 60 coutの<< ANS << てendl; 61 リターン 0 ; 62 }