分別(リニアDP)

トピック:

長さ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 }

 

 

おすすめ

転載: www.cnblogs.com/Spring-Onion/p/11355525.html