トピック:
長さN Aの配列を与えられ、長さN Bの配列を構築し、満たします
1、B、すなわち、厳密に単調ではないB 1 ≤ B 2 ≤ ... ≤ B N又はB 1件の≥ B 2 ≥ ... ≥ B N。
2、最小限 S = [シグマN I = 1 | A I - B I |。
これは単に最小S.が必要です
入力形式
最初の行は、整数Nを含んでいます
次のN個の行は、各列は、整数含まA Iを。
出力フォーマット
出力整数、Sは最小値を表します。
データ範囲
1 ≤ N ≤ 2000
1 ≤ | で| ≤ 10 ^ 9
サンプル入力:
7
1
3
2
4
5
3
9
出力例:
3
解题报告:这是一道dp的题目,咱们首先要保证的就是这个b序列应该是非严格单调的,要求他的差值的绝对值之和最小,所以咱们就要尽可能地满足最长上升子序列(维护最小地花费),
先把a数组存进另一个数组里,进行离散化处理,别的题解说的是数据的范围过大且数目较少,但是我没有很理解这点,维护地dp数组,dp[i][j]代表地就是前i个数以b[j]作为结束地最小
花费,这里的貌似只需要维护递增的就可以,不需要去处理递减的情况
ac代码:
1つの#include <iostreamの> 2の#include <アルゴリズム> 3の#include <CStringの> 4。の#include <cstdioを> 5。の#include <cmath> 6。 使用した 名前空間STD; 7のtypedef ロング ロングLL; 8 。9 のconst int型 MAXN = 2100 ; 10 LL [MAXN]、B [MAXN]; 11 ; LL DPは[MAXN] [MAXN] 12である INT N-、 13である // DP [I] [J] iが最小コスト前、およびNUMの番号を表す[J 】端部の最小コスト 14 // 数値の大きい範囲に起因するが、桁数が比較的少ないので、別個であってもよいが、デジタルセクションにマッピングされる 15 INTmain()の 16 { 17 のscanf(" %d個"、&N) 18 のために(int型 i = 1 ; iが<= N; iが++ ) 19 { 20 のscanf(" %のLLD "、および[I])。 21件の B [I] = [I]。 22 } 23 ソート(B + 1、B + 1個の + N)。 24 int型 M =一意(B + 1、B + 1 + N)-B- 1 。 25 memsetの(DP、0、はsizeof (DP))。 26 のためには、(int型 i = 1 ; iが<= N; iが++ ) 27 { 28 LL TMP = DP [I- 1 ] [ 1 ]。 29 のために(INT J = 1 ; J <= Mであり、j ++ ) 30 { 31 TMP =分(TMP、DP [I- 1 ] [J])。 32 DP [I] [j]は、TMP + ABS =([I] - 、B [j]を)。 33 } 34 } 35 LL ANS = 0x3f3f3f3f 。 36 のためには、(int型 I = 1 ; I <= M; iは++ ) 37の ANS = 分(ANS、DP [n]は[I])。 38 のprintf(" %LLDする\ n " 、ANS)。 39 40 41 }