あなたは10進の数値の文字列を与えられている... CodeForces - 1202B [シンプルDP] [補充]

教育分野のcodeforces前日問題を修復。Aは唯一の問題でした。

 

質問のおおよその意味:

定義されたX - Y - カウンタ:カウンタが加算されます。初期値は任意に選択、または+ X + Y我々は、最後のそれぞれの結果を蓄積する列の数を生成することができる、0です。

例えば: - 2から4 +4 +4 +4 +4 +4 +2 04 824用カウンタの列の数を生成します。xまたはyを追加するために、各ステップは任意です。

あなたが挿入されるべき少なくともデジタル数この中間部分文字列の列数を生成含ん9に番号0の両方を聞いて、シリーズ(0〜9で構成される文字列)を得ました。10 * 10行列形式を出力します。

例:文字列を与えられた: - 3 - 4と0840のカウンタが0を生成する(4)8(1)4(7)デジタル0に行の最小数であり、次いで、4行目と3列目は3です。

サンプル入力:

0840

出力例:

-1 17 7 7 7 -1 2 17 2 7
17 17 7 5 5 5 2 7 2 7
7 7 7 4 3 7 1 7 2 5
7 4 5 7 3 3 2 5 2 3
7 5 3 3 7 7 7 1 2 7
-1 5 7 3 7 -1 2 9 2 7
2 2 1 2 1 2 2 2 0 1
17 7 7 5 7 9 2 17 2 3
2 2 2 2 2 2 0 2 2 2
7 7 5 3 7 7 1 3 2 7

 

アイデア:

Taogeコードをシャイニングし、一瞬のために自分の考えを理解しています。その後、彼は再びノックしました。
まず、最初のxにステップ、Y加数桁の最小数となるように各ステップの数は、2つの中間のステップの最小数を挿入するため、MODアイデアDPによって数

文字の最小数が+1の真ん中に表示されます。それを9に再循環配列生成I、J。次いで、マトリックスは、印字文字列ごとに二つの数字、直接的置換との間の差から計算されます

DP [X] [Y] [ S [I] - S [I - 1] - 1 です。転写式:DP [X] [Y] [MOD] =分{J} + I((I *はJ * X + Y)MODの== 10%)

 

コード:

 

コードをコピー
1 / *
 2 2019年8月10日16点43分 3 時間4 936ms 5 メモリ6 5312kB 7 長さ8 1497 * / 9の#include <cstdioを> 10の#include <CStringの> 11の#include < ストリング> 12の#include < iostream> 13 使って名前空間はstdを、14 15のtypedef 長いLL。16 のconst int型MAXN = 50 17 のconst int型INF = 0x7f7f7f7f 18 19LL DP [MAXN] [MAXN] [MAXN]。20 21 空隙充填()22 { 23 のために(int型i = 0; iは< 10; I ++ 24 のための(INT J = 0; J < 10; J ++ 25 のための(INT K = 0、K < 10あり、k ++ 26 DPは[i] [j]は[K] = INFと、27 リターン; 28 } 29 ボイドのinit()30 { 31 フィル()。32 のために(int型のx = 0; X < 10であり、x ++ 33(のためにINT Y = ; Y <0 10; Y ++ ){ 34であるため(INT I = 0;私は< 10; I ++)// 私は、Jのみ0~9からは、X上で見つけることができる循環- Yが- MODカウンタステップの最小数を生成します。35 (のためにINT J = 0; J < 10; J ++ ){ 36 IFが(私はJの== + 0)を続行; // 0 - 0 -カウンタスキップの任意の数を生成しないように。37 [ INT(IはX + J * Yを*)= MOD%10 ; 38は、DP [X] [Y] [MOD] =分(DP [X] [Y] [MOD]、1LL *(IがJ + 1))です。// 状態遷移。39 } 40 } 41は戻り42です}43は、44 LL CAL(ある整数のX、INT Y、int型A、int型B)45 { ; = B - 46である// 時間は、第1減算Bように添加する数などから算出されますモジュロの10 + 10は影響しません。47 (<IF 0)= A + 10 ; 48 リターンDP [X] [Y] [A]; 49 } 50 51であるINT (メイン)52れる{ 53は、ストリングS; 54 CIN >>あるS; 55 56である(INIT) 、57である58 INT = N- s.length(); 59 (のためにINT X = 0; X < 10、X ++){ 60 (のためにINT Y = 0; Y < 10; Y ++ ){ 61はLL ANS =で0 62であるため(INT I = 1; I <N - 、I ++は{)63 LL = CAL CNT(Xは、 Y、Sは、[I] - ' 0 '、S [I - 1] - ' 0 ' ); ; 64 ANS = CNT + // 各桁位置への答えを数え、その後出力されます。65 IF(ANS> = INF)BREAK ; 66のANS - ; // 最後の番号が介在の数に私たちが望むものではなくので、最初にカットします。67 } 68 69 IF(ANS> = INF)のprintf(" -1 " ); 70他のprintf(" %のLLD " 、ANS)。71 } 72のprintf(" の\ n " ); 73 } 74 リターン0 75}
コードをコピー

 

 

 

経験:

TaogeのTQL!

おすすめ

転載: www.cnblogs.com/satchelpp/p/11333092.html