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 ' ; }