羅区P1043(問題への水問題の解決)

まず、第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まあ理解しやすいです

再列挙セグメントの数であります

また、これは、更新される答えを理解することは良いことです

最後の点の列挙短い答えとアップデート

おすすめ

転載: www.cnblogs.com/lifeisabadword/p/11722838.html