多くの有向グラフのようなDPの状態遷移:各点の状態は、転送プログラムの各々は、有向エッジであります
この問題は、必要とされる最小数は、我々は状態を使用し、得られている[I、J]は、I、及びJビットの数は、その後[0,9] 10個の数字を表す各点10有向エッジから始まるモジュロを示し
BFSは、(BFSの順序ため)現在の最小値である必要があり、最終的な計算さが最小数であることを保証することが可能であるによるチームの最初のポイントに、各状態点から搬出しました
/ * DP [I] [j]は、iの残りを表し、jは状態であり、アクセスするかどうかを [I、J、K]は状態を示し、[I、J] Kを事前によっては得られるから転送される と同等そこ図のD * Sノード、左最外側経路に移動し、(0,0)、(0、S)に来てから * / の#include <ビット/ STDC H ++> の#include <キュー> 使用 名前空間STD; int型の D、S、DP [ 505 ] [ 5005 ]; 構造体ノード{ int型のX、Y、Z、 ノード(){} ノード(int型 X、int型 Y、int型Zを):X(X)、Y(Y )、Z(Z){} }事前[ 505 ] [ 5005 ]; ボイドプリント(int型 T1、int型T2){ もし(T 1 || T2){ 印刷(プレ[T1]、[T2] .X、予め[T1]、[T2] .Y)。 COUT << プレ[T1]、[T2] .Z。 } } キュー <ペア< 整数、整数 >> Q。 INT メイン(){ CIN >> D >> S。 q.push(make_pair(0、0 )); DP [ 0 ] [ 0 ] = 1 。 一方、(!q.empty()){ 対 < INT、INT > P = q.front(); q.pop()。 以下のための(int型 = Iを0 ; iが<= 9 ; iは++ ){ int型の T1 =(p.first * 10 + I)%のD。 INT T2 =(p.second + I)。 もし(DP [T1]、[T2])続けます。 もし(T2> S)ブレーク。 q.push(make_pair(T1、T2))。 DP [T1]、[T2] = 1 。 プレ[T1]、[T2] = ノード(p.first、p.second、I)。 } } もし(DP [ 0 ] [S] == 0 ){ プット(" -1" ); 戻り 0 ; } そうでなければ{ プリント(0 、S); } }