羅区P2549電卓の書き込み

トピックポータル

問題解決のアイデア:

バックパック、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 }

 

おすすめ

転載: www.cnblogs.com/lipeiyi520/p/12339786.html