In primo luogo, abbiamo bisogno di trovare una formula ricorsiva:
A partire dalla cifra meno significativa (LSD) per la cifra più significativa (MSD), abbiamo una soluzione valida se dopo calcoliamo la MSD, abbiamo S(x) = S(x*m)
per verificare se un numero è una valida soluzione, abbiamo bisogno di sapere tre cose:
- Qual è la somma corrente di cifre S (x)
- Qual è la corrente somma della cifra S (x * m)
- Qual è la cifra corrente.
Quindi, per rispondere per la prima e l'ultima, è facile, abbiamo solo bisogno di mantenere due parametri sum
e digit
. Per calcolare il secondo, è necessario mantenere due parametri aggiuntivi, sumOfProduct
e lastRemaining
.
sumOfProduct
è la corrente S (x * m)
lastRemaining
è il risultato di (m * current digit value + lastRemaining)/10
Ad esempio, abbiamo x = 123
e m = 23
Prima cifra = 3
sum = 3
digit = 0
sumOfProduct += (lastRemaining + 3*m) % 10 = 9
lastRemaining = (m*3 + 0)/10 = 6
Seconda cifra = 2
sum = 5
digit = 1
sumOfProduct += (lastRemaining + 2*m) % 10 = 11
lastRemaining = (m*2 + lastRemaining)/10 = 5
Ultima cifra = 1
sum = 6
digit = 2
sumOfProduct += (lastRemaining + m) % 10 = 19
lastRemaining = (m + lastRemaining)/10 = 2
Poiché questa è l'ultima cifra, sumOfProduct += S(lastRemaining) = 21
.
Così, x = 123
e m = 23
non è un numero valido. Controllare x*m = 2829 -> S(x*m) = S(2829) = 21
.
Quindi, possiamo avere una formula ricorsiva con stato (digit, sum, sumOfProdut, lastRemaining)
.
Pertanto, il nostro stato di programmazione dinamica è dp[18][18*9 + 1][18*9 + 1][200]
(come m < = 100, quindi lastRemaining
non superiore a 200).
Ora lo stato dp
a più di 300 MB, ma se usiamo un approccio iterativo, diventerà più piccola, con circa 30 MB
fonte
2015-09-14 18:07:27
Non capisco il problema. Non sembra essere ben posizionato. Nel tuo primo esempio: x = 2, S (x) = S (2) = 2; S (x * m) = S (4) = 4, che viola S (x) = S (x * m).Nel secondo caso, con m = 1, qualsiasi numero con n cifre sarebbe una soluzione. – isanco
Sarei molto sorpreso se DP lavorasse qui. Perché pensi che funzionerebbe qui? In primo luogo, vorrei cercare alcune regole/modelli. Ad esempio, divisibilità per 9, a seconda di (m modulo 9) è possibile limitare automaticamente i valori possibili. Naturalmente se m = 1,10,100 la risposta è ovvia. La risposta per m = k * 10 è la stessa di m = k. Ancora per n = 18, non vedo alcun modo per risolvere questo prima della fine dell'universo. –
@isanco. Il risultato è 2 perché '[0, 9]' sono possibili risposte. –