タイトル効果:nタプルがあり、最初の並べ替えキーを押し、値を各隣接のために定義される第二の内の2つの重要な要素の差分絶対値と。今、あなたは最小値を見つけ、K-タプルを削除します。
発注に関連する最初のキーワードとして、順序を排出することはできません。
そのタプルを除去Kを考える、NKタプルを保持する方がよいです。
F [i]が[j]は最初のi-タプルに対してj番目に予約最小コスト(Iを含んでいなければならない)から、I-1番目のタプルJ-1保持番目、列挙遷移点T前に、与えるように設定状態遷移方程式:
F [I] [J] =分{F [T] [J-1]}(J-1≤t<I)
初期化:[I] [1] = 0 F
回答分{F [i]が[K]}(k≤i≤n)
DPコードは、一般的なコメントは必要ありません
#include <iostreamの> する#include <iomanip> の#include <CStringの> する#include <cstdioを> する#include <cmath> の#include <アルゴリズム> の#include <地図> 使用して 名前空間STD。 #define INF 0x3f3f3f3f インラインINT 読み出す(){ チャーCH。 BOOL BJ = 0 。 しばらく(!isdigit(CH = getchar関数())) BJ | =(CH == ' - ' ); INT RES = CH ^(3 << 4 )。 一方、(isdigit(CH = GETCHAR())) RES =(RES << 1)+(RES << 3)+(CH ^(3 << 4 ))。 リターン?BJ - 解像度:解像度。 } ボイド printnum(INT X){ 場合(X> 9)printnum(X / 10 )。 putchar(Xの%10 + ' 0 ' )。 } インラインボイドプリント(INT X、チャーCH){ 場合(X < 0){ putchar(')(読み取ります。- " ); X = - X。 } printnum(X)。 putchar(CH)。 } int型N、K。 構造体ノード{ int型H、W。 インラインブール 演算子 <(ノードX)のconst { 戻り H < XH。 } } [ 105 ]。 INT [F 105 ] [ 105 ]。 int型 ANS = 0x3f3f3f3f 。 署名された{)(メイン N = K = N- (読み取り) にとって(int型 i = 1 ; iが<= N; iが++ ){ [I]・H = ()を読み取ります。 [I] .W = 読み取ります(); } ソート(A + 1、A + N + 1 )。 memsetの(F、0x3fを、はsizeof (F))。 以下のために(int型 I = 1 F [i]は[iが++; iが<= N)1 ] = 0 ; 以下のために(int型 I = 2、iがn = <; I ++ ) のための(INT J = 2、J <= K、J ++) のための(int型 L = J- 1、L <I、F L ++)[I] [J] =分(F [I] [J]、F [L] [J- 1 ] + ABS([I ] .w- A [L] .W))。 以下のために(int型私は= kは、iがn = <; iは++)ANS = 分(ANS、F [i]が[K])。 印刷(ANS、' \ N ' ); リターン 0 ; }