コスト単調シーケンスを最小化しようとするサイズを小さくすることにより、古典的な成長。
この質問のために、厳密な問題への事前要件が厳しく、単調単調ではなく、そこではありません
この場合、我々は、プロパティを取得することができ、最終的にすべての値は、実際には貪欲で、元の配列のうち、左と右または減算によって等しくたら、その後、加算と減算の必要がないので、アイデアは、良いと思いますされています
しかし、この質問を要求していると、言い難いので、既知の問題への問題と見なされます
以下のように元の問題のために、実際には、[I] -a [J]> = 0
問題はその後である[I] -a [J]> = IJ、私達はちょうど私が、上記の問題に変換され、元の保存インデックスの列番号を入力します
これは、[i]は-i> = [J] -jです。
DPの問題については、セットパーティショニングされるように、そのような数値的な問題、および、そのようなデータ範囲のために、当然考慮に二次元の状態を取って、最初のディメンションは、私の前に二次元の自然重点を置いている、我々は一般的に話題を探して情報
思考の第二の寸法は、彼らがすべての状態を分割する方法を検討することで、一般的には、さまざまな状況での最後のビットが異なると考えることができます。上述によると、jは常にオリジナルシリーズ内の値である、のでだから、私たちは私の前に設計することができ、この時間は、i番目の値jは、最小であります
我々は異なるフロントKを見つけたいので、しかし、それは、複数の列挙が必要で、1 <= K <= jは、要件を完了するためには、あまり一般的な最適化がありました、私たちはDP I前の状態を変更します状況I-jが最大です。これは、接頭辞によって最適化することができます
この質問の離散とバーストINTに
書式#include <iostreamの> の#include <CStringの> の#include <cstdioを> する#include <マップ> 書式#include <アルゴリズム> 書式#include <キュー> の#include < 設定 > の#define ULL符号なしの長い長い 使用して 名前空間はstdを、 typedefの長い 長いLL。 ペアのtypedef < int型、int型 > PLL。 CONST INT N = 1E5 + 10 。 LL F [ 3010 ] [ 3010 ]。 ベクトル <LL> NUM; LL A [N]。 int型のmain(){ int型、nは cinを >> N; int型私は、 ための式(I = 1 ; I <= N; I ++ ){ CIN >> [I]。 [I] - = I。 num.push_back([I])。 } のmemset(F、0x3fを、はsizeof F)。 ソート(num.begin()、num.end()); num.erase(ユニーク(num.begin()、num.end())、num.end())。 INT CNT = num.size()。 ための式(I = 1 ; iが<= CNT; I ++ ){ F [ 1 ] [I] = ABS([ 1 ] -num [I- 1 ])。 もし(I> 1 ){ F [ 1 ] [I] =分(F [ 1 ] [i]は、F [ 1 ] [I- 1 ])。 } } int型J。 ための式(I = 2、iが<= N; iが++ ){ ため(J = 1 ; J <= CNT; J ++ ){ F [I] [J] =分(F [I] [J- 1 ]、F [ I- 1 ] [J] + ABS([I] -num [J- 1 ]))。 } } COUT << F [N] [CNT] << ENDL。 リターン 0 ; }