トピックポータル
問題解決のアイデア:
バックパック、F [i]はiが、達成可能な最大スコアの中央値時間計算を表します。
ディスプレイの回答の項目の順序は、例えば、二つの文字列、B影響力のある、これは文字列であること+ bのaとb + 2つの状況(ノートがあることを01の異なる場所でのこの質問のバックパック)、
DPの後遺症から逸脱することなく、これでターン
我々は最初の記事転送がI + 1の後に記事の前に転送しなければならないので、私は、その文字列は、(それが追加することができる場合)、iの文字列の後ろにある位置でI + 1に追加されます。
私が文字列の文字列の前に表示さI + 1があるかもしれない、残効が今そこにあることは明らかであることは明らかです。
どのように我々はそれからやるべきかの並べ替え!(参照コードCMP機能)
F intは、それがどのような最大を再定義し、この問題のためありません。
ACコード:
1の#include <iostreamの> 2の#include <cstdioを> 3の#include <マップ> 4の#include <アルゴリズム> 5 6を 使用して 名前空間STDを、 7 8 int型、D、N、PPP。 9 列 G [ 10001 ]、F [ 201 ]。 10地図< チャー、INT > 。 11 12インラインボイドmake_map(){ 13 [ ' Oは' ] [= ' D ' ] = 0 ; 14 [ ' G ' = 9 。 15 A [ ' B ' ] = 8 。 16 [ ' L ' ] = 7 。 17 [ ' Q ' ] = 6 。 18 [ ' S ' ] = 5 。 19 A [ ' H ' ] = 4 ; 20 [ ' E ' ] = 3; 21 A [ ' Z ' ] = 2 ; 22 [ [ I ' ] = 1 。 23 } 24 25インラインBOOL CMP(列 L、列B){ 26 列 X = L + B。 27 列 Y = B + L。 28 リターン X < Y。 29 } 30 31インライン列 _max(列 L、列B){ 32 INT U = l.length()。 33 INT O = てb.length()。 34 であれば(U == 0)リターンB。 35 であれば(O == 0)リターンL。 36 であれば(L [ 0!] = ' 0 ' && B [ 0!] = ' 0 ' )、 37 であれば(U> O)リターンL。 38 他の 場合(U <O)リターンB。 39 であれば(L <B)リターンB; 40 リターンL。 41 } 42 43 、INT (){主 44 のscanf(" %D%D "、&D&N) 45 make_map()。 46 のために(INT iは= 1 ; I <= N I ++ ){ 47 列P。 48 cinを>> のp; 49 のために(INT J = p.length(); J> = 1 ; j-- ) 50 G [I] + =([P [J- 1 ]] + ' 0" ); 51 } 52 ソート(G + 1、G + N + 1 、CMP)。 53 のために(INT ; I> = I = N 1 ; i-- ) 54 のための(INT J = D; J> = G [i]が.LENGTH(); j-- ) 55 F [J] = _max(F [J]、F [JG [I] .LENGTH()] + G [I])。 56 であれば(F [D] [ 0 ] == ' 0 ' ){ 57 のprintf(" 0 " )。 58 PPP ++ ; 59 } 60 のために(INT ; I <F [D] .LENGTH(); I = PPP I ++ ) 61 COUT << F [D] [I]。 62 リターン 0 ; 63 }