ZOJ4027シーケンススワッピング(DP)

Dpの状態の設計上の問題は、一般的な引数yによると、あなたは最後の異なる量を考慮して、転送用のセットとして彼を見ることができ、非常に賢いです/

DP状態のタイトルの情報を観察することが、最初、彼は私がDPのすべてのステータスがタイトルから推測できると考えるものがあれば、このタイトルは、ブラケットが移動することができるかを示します参照してください。

我々は、さらに我々は、設計状態の性質に応じて期待することができるように共感右括弧があるので、左括弧のすべての相対的な順序は一定であり、唯一の左括弧と右括弧が変化して、それを見つけます。

そして、あなたは2次元配列を開きたい可能性があることを示す、この質問、1000のデータ範囲を観察します。これは、当然のことながら、それぞれの質問は必ずしも同じデータ主題と一致していないが、話題と人々は、データアウト混乱することはできません

この質問は、高い確率を推定することができるので、複雑さは条件を満たすことができるようになりますN ^ 2、二次元DPです。最初の直線寸法のDPは、一般に一定値i番目の前に、i番目の、または特定の値です。これは、第二の次元の状態を分析することです

情報主体は、はるかに、我々は答えが最大の値を取ることです尋ねると、ニーズの配列ではなく、二次元で表されるように、我々は自然の通常値DPの量を考慮して、この問題は、実現可能ではありません

だけにして、残りのブラケットは、このような性質を移動します。そして、この問題の難しさが一定であるブラケットの同じタイプの相対的な順序を考えることですので、ノー後の効果を考慮に入れると題しDP。状態のデザインなので

私は番目の左括弧がjに、この位置を移動させ(一方がカウントダウンされる前に、右の左括弧の位置が左括弧の左側の移動の範囲を決定するので、i)を、数値の最大値を得ることができるされています。それは便利に転送するので、それの後jに設計されていますなぜ

したがって、式をf [i]は[J] = MAX(F [I + 1] [J + 1] + V、F [i]は[J + 1])であり、それは式DPの定義に行われなければならない漏れませんオフ状態、我々は式は後で+ 1、I + 1番目及びj +以降、この最大値は、i番目の移動Jから転送された上にI + 1の位置に移動させることができることを意味します。

これは、すべての状態を含みます。もちろん、最終的な答えはF [CNT [1] [1]は、最後の一つは括弧を残し、後最初の位置に移動表します。これは間違いなく答えは、CNTは左括弧の数と逆の順序を示しています

書式#include <iostreamの> 
の#include <CStringの> 
の#include <cstdioを> 
する#include <マップ> 
書式#include <アルゴリズム> 
書式#include <キュー>
 の#define ULL符号なしの長い長い
 使用して 名前空間はstdを、
typedefの長い 長いLL。
ペアのtypedef < int型int型 > PLL。
CONST  INT N = 5E5 + 10 
LL F [ 1010 ] [ 1010 ]。
LL和[N]、B [N]。
LL [N]。
INT P [N]。
INT CNT [N]。
INT のmain(){
     int型のI。
    int型T;
    cinを >> トン。
    一方、(t-- ){
         int型N。
        文字列sの。
        cinを >> N;
        cinを >> 秒;
        S = "  " + S;
        ための式(I = 1 ; iが<= N; iが++ ){
            CIN >> [i]は、
        }
        CNT [N + 1 ] = 0 ;
        和[ 0 ] = 0 ;
        int型でも= 0 ;
        memsetの(F、0はsizeof F)。
        (; I> = iは、N = 1 ; i-- ){
            CNT [I] = CNT [I + 1 ] +(S [I] == ' '10 であれば(S [I] == ' ' ){
                和[全 + 1 ] =合計[すべて] + [I]。++ ;
            }
            他の{
                P [I] = TOT。
            }
        }
        LL ANS = 0 (; I> = iは、N = 1 ; i-- ){
             場合(S [I] == ' ' 続けますint型J;
            (J = N-CNT [I] + 1 ; J> = I; j-- ){
                F [CNT [I] [J] = F [CNT [I] - 1 ] [J + 1 ] + [I] *(和[P [I]] -和[N-J + 1 - CNT [I] ]);
            }
            (J = N-CNT [i]は、J> = 1 ; j-- ){
                F [CNT [I] [J] = MAX(F [CNT [I]、[J]、F [CNT [I]、[J + 1 ])。
            }

        } = F [CNT [ 1 ] [ 1 ]。
        coutの << ANS << てendl;
    }
}
コードの表示

 

 

 

おすすめ

転載: www.cnblogs.com/ctyakwf/p/12625100.html