まず、第1のACコード(のDPギャングスター法で始まる元リンク)
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 INTの N、M、F1 [ 110 ] [ 110 ] [ 110 ]、F2 [ 110 ] [ 110 ] [ 110 ]、[ 110 ]、和[ 110 ]。 INT MOD(INT X){ リターン(X%10 + 10)%10 。 } int型のmain(){ CIN >> N >> M。 用(int型 I = 1 {CIN >> [i]はiが++; iが<= N);和[I] =和[I- 1 ] +[I];} ため(INT I = 1 ; I <= N - 、Iは++){[Iが+ N-] = A [I]、SUM [I + N- = SUM [I] + SUM [N-]。 } のmemset(F2、127、はsizeof(F2)); // F2レコードが最小値に初期化されるので、最大値 のために(INT I = 1 ; Iは、<= 2 * N-; I ++は){ ため(INT J = I、J <= 2 * N-; J ++ ){ [I] F1 [J] [ 1。 F2 = [I] [J] [ 1。 = MOD(SUM [J] -sum [I-] 1。 ]); / / 各セグメント値を治療前 } } のために(INTL = 1。 ; L <= N-; L ++){ // インターバル長 のために(int型 Iは、= 1、J = I + L- 1。 ; J <= 2 * N-; I ++は、J ++){ // 左エンドポイント のための(INT = H 2 ; H <= M; H ++){ // セグメントの数 のために(INT K = I + H- 1。 ; Kは<J、K ++){ // 短い点 F1 [I] [J] [ H] = MAX( F1 [I] [J] [H]、F1 [I] [K] [H- 1 ] * MOD(SUM [J] - SUM [K])); F2 [I] [J] [H] =分(F2 [I]、[J]、F2 [I] [H] [K] [H- 1 ] * MOD(SUM [J] - SUM [K]))。 } } } } int型 MAXN = 0、ミネソタ州= 0x7FFFFFFFで。 以下のために(int型 I = 1 {; iが++; iが<= N)// 找答案啦~~~ (MAXN、F1 [i]は[I + N- MAXN =最大1 ] [M])。 ミネソタ州 =分(ミネソタ州、F2 [I]は、[I +はN- 1 ] [M])。 } COUT <<ミネソタ<< ENDL << MAXN。 }
ギャングのアイデア
状態を設定します。
DPルーチンが配置されているものが何であるかを尋ねるする権利があり、その後、DPの範囲は、この古典的なタイトルがあります
そこで、IからJまでの最大と最小の分割されたセグメントを表し、F [i]は[J] [H] Hを聞かせ
伝達方程式
私たちは、状態遷移方程式から引き出すことができます。
F [I] [J] [H] =最大/最小(F [I] [J] [H]、F [i]が[K] [H-1] *和)F [ I ] [ J ] [ H ] = m個のA X / M I N (F [ I ] 、[ J ] 、[ H ] 、F [ I ] [ K ] [ H - 1 ] * S のU M )
列挙最初の間隔の長さ
私たちが知っているテンプレートの正常範囲からDP
理由:
我々は最初のiを列挙した場合、J
例えば、I = 1、J = 10、K = 5の場合
F [1]〜[5]、[H]、それはそう間違って処理されていません
そして、エンドポイントについて列挙
これは、間隔DPまあ理解しやすいです
再列挙セグメントの数であります
また、これは、更新される答えを理解することは良いことです