2019頭の牛のオフより多くの訓練学校第四K.number(思考)

トピックポータル

質問の意味:

のみ得られたを含む数値文字列を入力ストリング300の数の倍数である(そう計算0,00,000異なる位置、及び先行ゼロの場合を考えます)。

サンプル入力:

600

123000321013200987000789

サンプル出力:

4

55

ソリューション:

O(n)のアプローチ:、プレフィックスと3つ以上の合計、NUMの統計合計数[合計]を取るしようとしている、再び反復経験をベースと次の0、統計が追加する前に番号を入れて、最後に追加一人で数0。

O(300N)DPの実践:以下

公式ソリューション:

コード:

O(N)、次

/ * 6msの* / 
1
の#include <ビット/ STDC ++ H> 2のtypedef 長い LL。 3 使用して 名前空間はstdを、 4 のconst int型 M = 1E5 + 5 5 チャーS [M]。 6 INT メイン() 7 { 8 ながら(〜のscanf(" %sの"、S + 1 )) 9 { 10 INT LEN = STRLEN(S + 1)、和= 0、NUM [ 3 ] = {}; 11 LLのCNT =0 ; 12 NUM [ 0 ] = 1 13 のためには、int型 i = 1 ; iは= LEN <; iは++ ){ 14 合計は=(和+(S [I] - ' 0 '))%3 15 であれば(S [I] == ' 0 ' && S [I + 1 ] == ' 0 ' ){ 16 、CNT + = NUM [和]。 17 } 18 であれば(S [I] == ' 0 ')CNT ++ 19 NUM [合計] ++ ; 20 } 21 のprintf(" %LLDする\ n " 、CNT)。 22 } 23 リターン 0 24 }

 [O(300N)]を次のようにDPのアプローチです。

/ * 224ms * / 
1
の#include <ビット/ STDC ++ H> 2のtypedef 長い LL。 3 使用して 名前空間はstdを、 4 のconst int型 M = 1E5 + 5 5 チャーS [M]。 6 INTの DP [M] [ 302 ]。 7 INT )(メイン 8 { 9 ながら(〜のscanf(" %sの"、S + 1 )) 10 { 11 のmemset(DP、0はsizeof (DP))。 12 DP [ 1 ] [S [ 1 ] - ' 0 ' ] = 1 13 INT LEN =のSTRLEN(S + 1 )。 14 のためにint型 I = 2 ; iがLEN = <; Iは++ ){ 15 、DP [I] [S [I] - ' 0 ' ] ++ ; 16 のためのint型 J = 0 ; J < 300 ; J ++ ){ 17 のintフラグ=(J * 10の + S [I] - ' 0 ')%300 18 DP [I] [フラグ] + = DP [I- 1 ] [J]。 19 } 20 } 21 LL ANS = 0 22 のためにint型 i = 1 ; iがLEN = <Iは++ 23 ANS + = DP [I] [ 0 ]。 24 のprintf(" %LLDする\ n " 、ANS)。 25 } 26 リターン 0 27 }

 

おすすめ

転載: www.cnblogs.com/HOLLAY/p/11264713.html