[Python] Kumulative Summe ABC179D

ABC179D Als einfache Lösung

dp[i]:=Anzahl der Operationsreihen bis zum Erreichen der Masse i

Eine dynamische Planungsmethode, die alle Bewegungen für jeden Ort i versucht, kann in Betracht gezogen werden, aber der Zeitberechnungsbetrag beträgt $ O (N ^ 2) $. Die Aktualisierungsformel lautet wie folgt.

dp[i] = \sum_{v\in S} dp[i-v] \\

In solchen Fällen ist es Standard, eine kumulative Summe zu verwenden, um DP zu beschleunigen. Zunächst ist der Teil $ \ sum_ {v \ in S} dp [iv] $ die Summe der "Summen innerhalb der Intervalle" für die K Intervalle, wobei die Menge S aus K Intervallen besteht. Es stellt sich heraus, dass es eine Sache ist. Es sei daran erinnert, dass im Allgemeinen die Summe der Intervalle [l, r) des Arrays a durch s [r] - s [l] dargestellt werden kann, wobei s die kumulative Summe des Arrays a ist. Wenn daher die kumulative Summe des Arrays dp sumdp ist, kann der Aktualisierungsausdruck wie folgt transformiert werden.

dp[i] = \sum_{k=1}^K (sumdp[i-l_k+1]-sumdp[i-r_k]) \\

Der Berechnungsbetrag beträgt $ O (NK) $.

(Referenz) Kann kumulative Summen schreiben, ohne nachzudenken!

Beispielcode


MOD = 998244353
N, K = map(int, input().split()) #N ist die Anzahl der Quadrate, K ist die Anzahl der Abschnitte(K ist 10 oder weniger)
sec = [tuple(map(int, input().split())) for _ in range(K)]

dp = [0] * (N+1)
dp[1] = 1

sumdp = [0] * (N+1)
# i-l=1(Aktuelle Masse)Wenn es wird, dp[i]Erhöhen Sie um 1
sumdp[1] = 1

# i=Sumdp in der Reihenfolge von 2 bis N.[i]Aktualisieren
for i in range(2, N+1):
    #Dp durch kumulative Summe sumdp in jedem Intervall[i]Aktualisieren
    for l, r in sec:
        li = max(i - l, 0)
        ri = max(i - r - 1, 0)

        dp[i] += sumdp[li] - sumdp[ri]
        dp[i] %= MOD

    sumdp[i] = sumdp[i-1] + dp[i]

print(dp[N])

Recommended Posts

[Python] Kumulative Summe ABC179D
[Python] ABC175D
Kumulativer Summenkommentar
[Python] DP ABC184D
[Python] UnionFind ABC177D
Löse ABC168D in Python
Löse ABC167-D mit Python
[Python] Bisection-Suche ABC155D
Löse ABC159-D in Python
Implementieren Sie sum in Python
[Python] BFS (Suche nach Breitenpriorität) ABC168D
Kumulative Summen- und Kartoffelmethode
[Python] DFS (Tiefenprioritätssuche) ABC157D
Lösen mit Ruby und Python AtCoder ABC133 D Kumulative Summe
Python
[Python] Wie man nCk ableitet (ABC156-D)
AtCoder ARC104 B Kumulative Summe in Ruby, Python und Java gelöst
(Python) ABC162-D Diskussionsprotokoll und Lösung
AtCoder ABC130 D Kumulative Summen-Dichotomie, gelöst durch Ruby und Python
Lösen mit Ruby, Perl, Java und Python AtCoder ARC 098 C Kumulative Summe
Lösen mit Ruby und Python AtCoder Tenka1 Programmer Contest C Kumulative Summe
Lösen mit Ruby und Python AtCoder ABC172 C Kumulative Summen-Dichotomie
PRML Kapitel 8 Summe der Produkte Algorithmus Python-Implementierung
Projekt Euler # 16 "Summe der Kräfte" in Python
Lösen mit Ruby und Python AtCoder ABC084 D Kumulative Summe der Primzahlen