[牛] 3(ダイナミックプログラミング)で割り切れる-21302配列オフでした

シーケンスは3で割り切れます


タイトル説明

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

説明を入力します。

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

出力説明:

整数出力

例1

エントリー

132

輸出

3

例2

エントリー

9

 

輸出
1
トピックリンク:
 
LENが提供され、各追加番号、シーケンスは2 * LEN + 1となり最初の数値文字列の各列の最初の数から続くと考えてもよい、この質問について考えて書き込むことができます。
提供DP [0]、DP [1]、DP [2]、3が得られた余りが0,1,2である意味します。アレイ全体の更新の各追加数。
余りが0:DP [0] = DP [0] + DP [0] +1。
      DP [1] = DP [1] + DP [1]。
      DP [2] = DP [2] + DP [2]。
残りは1:DP [0] = DP [0] + DP [2]。
      DP [1] DP [1] + DPを= [0] +1。
      DP [2] = DP [2] + DP [1]。
残りは2:DP [0] = DP [0] + DP [1]。
      DP [1] = DP [1] + DP [2]。
      DP [2] DP [2] + DPを= [0] +1。
何がいくつかの数字の対策を見つけるために、独自の法則
 
ACコード
1の#include <iostreamの>
 2の#include <cstdioを>
 3の#include <fstreamの>
 4の#include <アルゴリズム>
 5の#include <cmath>
 6の#include <両端キュー>
 7の#include <ベクトル>
 8の#include <キュー>
 9# <含む文字列 >
 10の#include <CStringの>
 11の#include <地図>
 12の#include <積層>
 13の#include < 設定 >
 14  使用 名前空間STDを、
15  CONST  INTモッド= 1E9 + 7  チャー CH [ 1000年];
 17  INT DP [ 3 ];
 18は、 INT F(チャー S)// 文字列整数変換
19。 {
 20      戻り S- ' 0 ' ;
 21である }
 22である INT (メイン)
 23である {
 24      (cin.getline CH、1000年)、
 25      のmemset(DP、0はsizeof (DP))、
 26は 
27      INT LEN =のSTRLEN(CH);
 28      INT= I 0、IがLEN <; Iは++)// の最初の数からトラバース
29      {
 30          / * 
31          ここでの焦点は、このステップは免れるべきではなく、数がオープンでなければならないサイズのDPを変更することが一時的にできない保存新しい
 32          等S0、S1、S2全て完了それを置き換えるために、または結果に影響を与える後に更新、
 33が         想定余りが2:[1]; DP [0] DP [0] + DP =
 34である                  [1] DPのDP = [を1] + DP [2];
 35                   DP [2] DP = [2] + DP [0]を+1しました;
 36          この後、このような更新の問題がある場合、DP [0]変化、DP [2] = DP [ 2] + DP [0]を+1しました;
 37 [          使用が新しいDP [0]、ない答えに準拠し
 38である         * / 
39          INT S0 = 0、S1 = 0、S2 = 0 ;
 40          int型 X =F(CH [I])。
41          場合(Xの%3 == 0 42          {
 43             S0 + = DP [ 0 ] + 1 44の             S1 + = DP [ 1 ]。
45の             S2 + = DP [ 2 ]。
46          }
 47          であれば(X%3 == 1 48          {
 49              S0 + = DP [ 2 ]。
50の              S1 + = DP [ 0 ] + 1 51              S2 + = DP [ 1];
 52である         }
 53が         IF(X%3 == 2 54は         、{
 55              S0 + = DPが[ 1 ];
 56は              S1 + = DPは、[ 2 ]、
 57は              + = DP [S2 0 ] + 。1 ;
 58          }
 59          // 均一更新
60          DP [ 0 ] + = S0;
 61である          [DP 1 ] + = S1;
 62は          DP [ 2 ] + = S2;
 63である         ためINT J = 0 ; J < 3。、J ++)// 各時間モジュロ1E9 + 7; 
64              DP [J] DP = [J]%モジュレーション;
 65      }
 66      COUT << DP [ 0 ] << ENDL;
 67 }

 

 

おすすめ

転載: www.cnblogs.com/sky-stars/p/10935644.html