配列は、(単純なDP)3で割り切れます

リンク:https://ac.nowcoder.com/acm/problem/21302
出典:牛オフネットワーク

タイトル説明

あなたは長さ50の数値文字列を与えるために、あなたはデジタルのシーケンスが割り切れるかもしれどのように多くのサブ尋ねる
の答えを法1E9 + 7

説明を入力します。

50未満の長さに等しい数からなる文字列を入力し

出力説明:

整数出力

具体的なアイデア:

DP残りはjは数あるCouchuことができる前に[i] [j]は、i番目の文字を表し、

ACコード:

1つの#include <ビット/ STDC ++ H>
 2  使用して 名前空間STDを、
3位LL定義長い 長い
4位INF定義0x3f3f3f3f 
5  CONST  INT MAXN = 2E5 + 100 6  のconst  int型 MOD = 1E9 + 7 7  チャーSTR [MAXN]。
8 LL DP [MAXN] [ 10 ]。
9  INT メイン()
 10  {
 11      のscanf(" %sの"、STR + 1 )。
12      INTLEN = strlenを(STR + 1 )。
13      int型 TMP = 0 14      のためには、int型 i = 1 ; iは= LEN <; iは++ 15      {
 16        DPを[I] [(STR [I] - ' 0 ')%3 ] = 1 17              のためにINT J = 0 ; J < 3 ; J ++ 18              {
 19                  DP [I] [J] + = DP [I- 1 ] [J]。
20                  DP [I] [J]%= MOD。
21                 DP [I] [J] + DP = [I- 1 ] [(J + 15 - (STR [I] - ' 0 '))%3。]; //相補的なことに留意すべきである
 22である                  DP [I] [J 】%= MODを、
 23である             }
 24  //             COUT I << << ENDL;
 25  //             のための(INT J = 0; J <3; J ++){
 26である //             COUT J << << "" << DP [ I] [J] << ENDL;
 27  //             } 
28      }
 29  //         ; I << << ENDL COUT
 30  //         のための(INT J = 0; J <3; J ++){
 31である //        coutの<< J <<」「<< DP [I] [J] <<てendl;
32  //         } 
33      のprintf(" %LLDする\ n "、DP [LEN] [ 0 ])。
34      リターン 0 35 }

 

おすすめ

転載: www.cnblogs.com/letlifestop/p/10958733.html
おすすめ