D1。カークとバイナリ列(簡単バージョン)

D1。カークとバイナリ列(簡単バージョン)

01はシーケンスをドロップしない最長の文字列を検索します

文字列sを与え、そしてそのような最長系列長と一致する任意の位置を低下させないことrに長い文字列T、Lを生成するのに必要な様

バックから暴力の列挙、列挙各0シーケンスの最大長を変更する代わりに、位置rの長さlに低下した場合

01はリニアDPを解くことにより、最長の文字列の順序を削除しません。

DP iはサブシーケンスの長さiの末尾に該当しない最長を表します

DP [0] DP [0] + S [I] == '0' =。

DP [1] = MAX(DP [0]、DP [1])+ S [I] == '1'。

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
#defineは長いlong int型
 の#define SC(X)のscanf( "%I64d"を、&​​(X)); 
typedefの長い 長いLL。
#define MAXN 2005 の#define INF 1E18 
LL N。
LLヴァル[ 2 ] [MAXN]。
LL DP [ 2 ]。
ボイド LIS(ストリング S、int型 ST、INT   ヴァル[])
{ 
    DP [ 0 ] = DP [ 1 ] = 0 以下のためにint型 = STをIを、I <Nで、iは++ ){
        

もし(S [I] == ' 0 ' ){ 
            DP [ 0 ] ++ ; 
        } 他の DP [ 1 ] = MAX(DP [ 0 ]、DP [ 1 ])+ 1 
        ヴァル[I] = MAX(DP [ 0 ]、DP [ 1 ])。
    } 

} 
)(主符号付き
{ 
    ストリングS、T。
    cinを >> 秒; 
    N = s.size()。
    T =のS。
    // int型のlen = 0; 
    INT I = N- 1; I> = 0 ; i-- 
    { 
        もし、(S [I] == ' 1 ' 
        { 
            T [I] =の' 0 ' 
            LIS(S、I、ヴァル[ 0 ])。
            LIS(T、I、ヴァル[ 1 ])。
            int型 J = I; J <N; J ++ ){
                 場合(valは[ 0!] [J] = valの[ 1 ] [J]){ 
                    T [I] = ' 1 ' ;
                    破ります; 
                }
            } 
        } 
    } 
    COUT << T << ' の\ n ' ; 
}

 

おすすめ

転載: www.cnblogs.com/liulex/p/11386740.html