Po pierwsze, musimy wymyślić rekurencyjnego wzoru:
Zaczynając od najmniej znaczącej cyfry (LSD) do najbardziej znaczącej cyfry (MSD), mamy ważne rozwiązanie jeśli po obliczamy MSD, mamy S(x) = S(x*m)
aby sprawdzić, czy dana liczba jest ważne rozwiązanie, musimy wiedzieć trzy rzeczy:
- Jaki jest obecny suma cyfr S (x)
- Jaki jest obecny suma cyfr S (x * m)
- Jaka jest bieżąca cyfra.
Aby odpowiedzieć na pierwszy i na koniec, jest to łatwe, musimy jedynie zachować dwa parametry: sum
i digit
. Aby obliczyć drugi, musimy zachować dwa dodatkowe parametry, sumOfProduct
i lastRemaining
.
sumOfProduct
jest obecny S (X * m)
lastRemaining
jest wynikiem (m * current digit value + lastRemaining)/10
na przykład, mieć x = 123
i m = 23
Pierwsza cyfra = 3
sum = 3
digit = 0
sumOfProduct += (lastRemaining + 3*m) % 10 = 9
lastRemaining = (m*3 + 0)/10 = 6
Druga cyfra = 2
sum = 5
digit = 1
sumOfProduct += (lastRemaining + 2*m) % 10 = 11
lastRemaining = (m*2 + lastRemaining)/10 = 5
Ostatnia cyfra = 1
sum = 6
digit = 2
sumOfProduct += (lastRemaining + m) % 10 = 19
lastRemaining = (m + lastRemaining)/10 = 2
Ponieważ jest to ostatnia cyfra, sumOfProduct += S(lastRemaining) = 21
.
Więc x = 123
i m = 23
nie jest prawidłowy numer. Sprawdź x*m = 2829 -> S(x*m) = S(2829) = 21
.
Możemy więc mieć formułę rekurencyjną o stanie (digit, sum, sumOfProdut, lastRemaining)
.
W ten sposób nasz stan programowania dynamicznego to dp[18][18*9 + 1][18*9 + 1][200]
(jako m < = 100, więc lastRemaining
nie większy niż 200).
Teraz stan dp
ma ponad 300 MB, ale jeśli używamy iteracyjnego podejścia, staje się mniejsze, stosując około 30MB
Nie rozumiem problemu. Wydaje mi się, że nie jestem dobrze postawiony. W twoim pierwszym przykładzie: x = 2, S (x) = S (2) = 2; S (x * m) = S (4) = 4, co narusza S (x) = S (x * m).W drugim przypadku, gdy m = 1, dowolna liczba z n cyframi byłaby rozwiązaniem. – isanco
Byłbym bardzo zaskoczony, gdyby DP działał tutaj. Jak myślisz, dlaczego to zadziała tutaj? Najpierw szukam reguł/wzorców. Na przykład, podzielność przez 9, w zależności od (m modulo 9) można automatycznie ograniczyć możliwe wartości. Oczywiście jeśli m = 1,10 100, odpowiedź jest oczywista. Odpowiedź dla m = k * 10 jest taka sama jak dla m = k. Wciąż dla n = 18, nie widzę żadnego sposobu rozwiązania tego przed końcem wszechświata. –
@isanco. Wynikiem jest 2, ponieważ '[0, 9]' są możliwymi odpowiedziami. –