πŸ₯œπŸ”¨ ДинамичСскоС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅: ΠΊΠ°ΠΊ Ρ‰Π΅Π»ΠΊΠ°Ρ‚ΡŒ Π·Π°Π΄Π°Ρ‡ΠΊΠΈ ΠΊΠ°ΠΊ ΠΎΡ€Π΅ΡˆΠΊΠΈ

Π“ΠΎΡ‚ΠΎΠ² ΡƒΠ·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ Π·Π°Π΄Π°Ρ‡ΠΊΠΈ, ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… плавятся ΠΌΠΎΠ·Π³ΠΈ? Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ раскрываСм Ρ‚Π°ΠΉΠ½Ρƒ происхоТдСния Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π° «динамичСскоС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅Β» ΠΈ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ основныС ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρ‹ ΠΊ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡŽ Π·Π°Π΄Π°Ρ‡, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ часто Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ Π½Π° собСсСдованиях ΠΈ сорСвнованиях.

ДинамичСскоС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ – ΠΌΠΎΡ‰Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ слоТных Π·Π°Π΄Π°Ρ‡ ΠΏΡƒΡ‚Π΅ΠΌ ΠΈΡ… разбиСния Π½Π° Π±ΠΎΠ»Π΅Π΅ простыС ΠΏΠΎΠ΄Π·Π°Π΄Π°Ρ‡ΠΈ. Π­Ρ‚ΠΎΡ‚ алгоритмичСский ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, Π²ΠΏΠ΅Ρ€Π²Ρ‹Π΅ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠΎΠΌ Π ΠΈΡ‡Π°Ρ€Π΄ΠΎΠΌ Π‘Π΅Π»Π»ΠΌΠ°Π½ΠΎΠΌ Π² 1950-Ρ… Π³ΠΎΠ΄Π°Ρ…, ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π» Ρ€Π΅Π²ΠΎΠ»ΡŽΡ†ΠΈΡŽ Π² области ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ нашСл ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π² самых Ρ€Π°Π·Π½Ρ‹Ρ… областях – ΠΎΡ‚ Π±ΠΈΠΎΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΠΊΠΈ Π΄ΠΎ экономики.

Π‘ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния раздСлСния исходной Π·Π°Π΄Π°Ρ‡ΠΈ Π½Π° ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ ΠΌΠ΅Π»ΠΊΠΈΡ… ΠΏΠΎΠ΄Π·Π°Π΄Π°Ρ‡ Π”ΠŸ ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ раздСляй ΠΈ властвуй. Однако ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ Π”ΠŸ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ΄Π½Π° ΠΈ Ρ‚Π° ΠΆΠ΅ ΠΏΠΎΠ΄Π·Π°Π΄Π°Ρ‡Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ для ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ эффСктивности Π”ΠŸ Π²Π°ΠΆΠ½ΠΎ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Ρ… вычислСний (ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ…).

ΠŸΠΎΡ‡Π΅ΠΌΡƒ динамичСскоС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚Π°ΠΊ называСтся
Π ΠΈΡ‡Π°Ρ€Π΄ Π‘Π΅Π»Π»ΠΌΠ°Π½, ΡΠΎΠ·Π΄Π°Ρ‚Π΅Π»ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π”ΠŸ, Π² 1950-Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π» Π² ΠΊΠΎΡ€ΠΏΠΎΡ€Π°Ρ†ΠΈΠΈ RAND, которая занималась исслСдованиями, Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹ΠΌΠΈ Π½Π° ΡƒΠΊΡ€Π΅ΠΏΠ»Π΅Π½ΠΈΠ΅ обороноспособности БША. Π­Ρ‚ΠΎ Π±Ρ‹Π» ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ напряТСнности ΠΈ Π³ΠΎΠ½ΠΊΠΈ Π²ΠΎΠΎΡ€ΡƒΠΆΠ΅Π½ΠΈΠΉ: ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ министра ΠΎΠ±ΠΎΡ€ΠΎΠ½Ρ‹ Уилсона, Π±Ρ‹Π»ΠΈ скСптичСски настроСны ΠΊ Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΌ Π½Π°ΡƒΡ‡Π½Ρ‹ΠΌ исслСдованиям, особСнно ΠΊ ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠ΅. Они ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°Π»ΠΈ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹, ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΡ‹Π΅ ΠΊ Π²ΠΎΠ΅Π½Π½Ρ‹ΠΌ Π·Π°Π΄Π°Ρ‡Π°ΠΌ. По словам Π‘Π΅Π»Π»ΠΌΠ°Π½Π°, Уилсон испытывал ΠΏΠ°Ρ‚ΠΎΠ»ΠΎΠ³ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Π½Π΅Π½Π°Π²ΠΈΡΡ‚ΡŒ ΠΊ слову «исслСдования»: Π΅Π³ΠΎ Π»ΠΈΡ†ΠΎ Π±ΡƒΠΊΠ²Π°Π»ΡŒΠ½ΠΎ Π±Π°Π³Ρ€ΠΎΠ²Π΅Π»ΠΎ ΠΎΡ‚ ярости, Ссли ΠΊΡ‚ΠΎ-Ρ‚ΠΎ ΠΈΠΌΠ΅Π» Π½Π΅ΠΎΡΡ‚ΠΎΡ€ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚ΡŒ ΠΎ ΠΊΠ°ΠΊΠΈΡ…-Ρ‚ΠΎ исслСдованиях Π² Π΅Π³ΠΎ присутствии. Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΎΠ½ Π½Π΅Π½Π°Π²ΠΈΠ΄Π΅Π» всС, связанноС с ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠΎΠΉ. А Π‘Π΅Π»Π»ΠΌΠ°Π½ Ρ€Π°Π±ΠΎΡ‚Π°Π» Π½Π°Π΄ слоТными ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ принятия Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΈ использования матСматичСского Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π°. ЖСлая Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚ΡŒ свои исслСдования ΠΎΡ‚ ΠΊΡ€ΠΈΡ‚ΠΈΠΊΠΈ ΠΈ сокращСния финансирования, Π‘Π΅Π»Π»ΠΌΠ°Π½ ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Π» для Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π½Π°Π·Π²Π°Π½ΠΈΠ΅ «динамичСскоС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅Β»: Ρ‚Π΅Ρ€ΠΌΠΈΠ½ Β«ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅Β» Π² Ρ‚ΠΎ врСмя ΡƒΠΆΠ΅ ассоциировался с практичСской Π΄Π΅ΡΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ, Π° Π½Π΅ с абстрактной ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠΎΠΉ, Π° «динамичСскоС» Π‘Π΅Π»Π»ΠΌΠ°Π½ Π΄ΠΎΠ±Π°Π²ΠΈΠ» просто ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π΅Π³ΠΎ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚ΡŒ Π² ΡƒΠ½ΠΈΡ‡ΠΈΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌ смыслС. [Из воспоминаний Π ΠΈΡ‡Π°Ρ€Π΄Π° Π­. Π‘Π΅Π»Π»ΠΌΠ°Π½Π° – Β«Π­ΠΏΠΈΡ†Π΅Π½Ρ‚Ρ€ ΡƒΡ€Π°Π³Π°Π½Π°: автобиография», World Scientic, 1984].

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ идСю Π”ΠŸ, рассмотрим Π·Π°Π΄Π°Ρ‡Ρƒ вычислСния чисСл Π€ΠΈΠ±ΠΎΠ½Π°Ρ‡Ρ‡ΠΈ. ΠŸΠ΅Ρ€Π²Ρ‹Π΅ Π΄Π²Π° числа Π€ΠΈΠ±ΠΎΠ½Π°Ρ‡Ρ‡ΠΈ – 0 ΠΈ 1. ΠŸΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ числа ΡΠ²Π»ΡΡŽΡ‚ΡΡ суммами Π΄Π²ΡƒΡ… ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… чисСл, формируя ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ 0, 1, 1, 2, 3, 5, 8, 13, 21, ... Числа Π€ΠΈΠ±ΠΎΠ½Π°Ρ‡Ρ‡ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… областях β€” ΠΎΡ‚ Π±ΠΈΠΎΠ»ΠΎΠ³ΠΈΠΈ Π΄ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° структур Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Ρ… вычислСний.

ΠœΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΡ‡Π΅ΡΠΊΠΈ n-Π΅ число Π€ΠΈΠ±ΠΎΠ½Π°Ρ‡Ρ‡ΠΈ F(n) задаСтся ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ΠΌ F(n) = F(n-1) + F(n-2), Π³Π΄Π΅ F(0) = 0 ΠΈ F(1) = 1. Ѐункция, которая вычисляСт F(n) рСкурсивно, Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ саму сСбя, ΠΈ Π΅Π΅ врСмСнная ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠΊΡΠΏΠΎΠ½Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ растСт с ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ n. Π­Ρ‚ΠΎ происходит ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ рСкурсивная функция ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ вычисляСт ΠΎΠ΄Π½ΠΈ ΠΈ Ρ‚Π΅ ΠΆΠ΅ значСния F(n):

ΠšΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Ρ… Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² Π΄Π΅Π»Π°Π΅Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ вычислСния n-Π³ΠΎ числа Π€ΠΈΠ±ΠΎΠ½Π°Ρ‡Ρ‡ΠΈ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ ΠΏΠΎ n, хотя ΠΈ Π·Π° счСт использования O(n) памяти:

def fibonacci(n, cache={}):
    if n <= 1:
        return n
    elif n not in cache:
        cache[n] = fibonacci(n - 1) + fibonacci(n - 2)
    return cache[n]

ΠœΠΈΠ½ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ объСма кэша β€” ΠΎΠ΄ΠΈΠ½ ΠΈΠ· самых Π²Π°ΠΆΠ½Ρ‹Ρ… аспСктов динамичСского программирования. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ использованиС памяти, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, начиная с ΠΏΠ΅Ρ€Π²Ρ‹Ρ… Π΄Π²ΡƒΡ… чисСл Π€ΠΈΠ±ΠΎΠ½Π°Ρ‡Ρ‡ΠΈ ΠΈ постСпСнно вычисляя ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅. Π­Ρ‚ΠΎΡ‚ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ позволяСт ΠΏΠ΅Ρ€Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ, храня Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послСдниС Π΄Π²Π° вычислСнных числа: врСмСнная ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ останСтся ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΉ β€” O(n), Π° пространствСнная ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡΡ Π΄ΠΎ O(1):

def fibonacci(n):
    if n <= 1:
        return n

    f_minus_2, f_minus_1 = 0, 1
    for _ in range(2, n + 1):
        f = f_minus_2 + f_minus_1
        f_minus_2, f_minus_1 = f_minus_1, f
    return f_minus_1

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ ΠΈ слоТности динамичСского программирования

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ с вычислСниСм ряда Π€ΠΈΠ±ΠΎΠ½Π°Ρ‡Ρ‡ΠΈ дСмонстрируСт Π³Π»Π°Π²Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π”ΠŸ β€” Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°ΠΉΡ‚ΠΈ Ρ‚Π°ΠΊΠΎΠΉ способ раздСлСния исходной Π·Π°Π΄Π°Ρ‡ΠΈ Π½Π° ΠΏΠΎΠ΄Π·Π°Π΄Π°Ρ‡ΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΠ»ΠΈΡΡŒ Π΄Π²Π° Π²Π°ΠΆΠ½Ρ‹Ρ… условия:

  • ΠšΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡ Π³ΠΎΡ‚ΠΎΠ²Ρ‹Ρ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ ΠΏΠΎΠ΄Π·Π°Π΄Π°Ρ‡ максимально ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ исходной Π·Π°Π΄Π°Ρ‡ΠΈ.
  • РСшСния ΠΏΠΎΠ΄Π·Π°Π΄Π°Ρ‡ ΠΌΠΎΠΆΠ½ΠΎ эффСктивно ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ.

Основная ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π”ΠŸ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π·Π°Π΄Π°Ρ‡: Π±Ρ‹Π²Π°ΡŽΡ‚ ситуации, ΠΊΠΎΠ³Π΄Π° Π½Π°Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ способа Π΄Π΅ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° Π·Π°Π΄Π°Ρ‡ΠΈ ΠΈ Π½Π΅Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° ΠΊ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΡŽ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ.

Рассмотрим Π±ΠΎΠ»Π΅Π΅ слоТный ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования Π”ΠŸ β€” Π² Π·Π°Π΄Π°Π½Π½ΠΎΠΌ массивС Ρ†Π΅Π»Ρ‹Ρ… чисСл Π½Π°ΠΉΠ΄Π΅ΠΌ подмассив с максимальной суммой элСмСнтов. НапримСр, Π² массивС [904, 40, 523, 12, -335, -385, -124, 481, -31] ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ подмассив начинаСтся с индСкса 0 ΠΈ заканчиваСтся индСксом 3, ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ сумму 1479:

Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ выглядит Ρ‚Π°ΠΊ:

  • Брутфорсный ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ вычисляСт сумму для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ³ΠΎ подмассива ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ O(nΒ³), ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ число Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… подмассивов Ρ€Π°Π²Π½ΠΎ nβˆ—(n+1)/2 => (O(n2)), Π° вычислСниС суммы Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ O(n). Π’ ΠΈΡ‚ΠΎΠ³Π΅ O(n2) * O(n) = O(n3).
  • Π£Π»ΡƒΡ‡ΡˆΠ΅Π½Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ O(n2) Π·Π° счСт ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ расчСта суммы прСфиксов ΠΈ использования памяти O(n). НуТно Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ массив s, Ρ‡Ρ‚ΠΎΠ±Ρ‹ s[k] Π±Ρ‹Π» Ρ€Π°Π²Π΅Π½ суммС элСмСнтов с индСксами ΠΎΡ‚ 0 Π΄ΠΎ k-1. Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ подмассива A[i..j] сумма Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π½Π° s[j+1] – s[i].
  • РаздСляй ΠΈ властвуй ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ O(n log n), ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ рСкурсивно Π΄Π΅Π»ΠΈΡ‚ массив ΠΏΠΎΠΏΠΎΠ»Π°ΠΌ ΠΈ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ.

Π Π΅ΡˆΠΈΡ‚ΡŒ эту Π·Π°Π΄Π°Ρ‡Ρƒ Π·Π° врСмя O(n) ΠΈ с использованиСм памяти О(1) ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ динамичСского программирования, ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎ вычисляя ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ сумму. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ΅ Π½ΠΈΠΆΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ извСстно ΠΊΠ°ΠΊ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ КаданС:

  • ВмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Ρ‚ΡŒ всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ подмассивы ΠΈ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ ΠΈΡ… суммы, ΠΌΡ‹ эффСктивно отслСТиваСм ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ сумму подмассива, Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‰Π΅Π³ΠΎΡΡ Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ.
  • Если тСкущая частичная сумма мСньшС минимальной встрСчСнной Ρ€Π°Π½Π΅Π΅, Ρ‚ΠΎ Π½Π°Ρ‡Π°Π»ΠΎ максимального подмассива ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ послС этой минимальной суммы. Вычитая ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ сумму ΠΈΠ· Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡƒΡŽ сумму подмассива, Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‰Π΅Π³ΠΎΡΡ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ элСмСнтом.
  • Если Π² массивС Π½Π΅Ρ‚ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… элСмСнтов, Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ считаСтся число, максимально Π±Π»ΠΈΠ·ΠΊΠΎΠ΅ ΠΊ 0. НапримСр, для массива [-335, -385, -124, -6, -31] Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ -6.
def find_maximum_subarray(A):
    if not A:
        return "Массив пуст"

    max_sum = float('-inf')
    current_sum = 0
    for x in A:
        current_sum = max(x, current_sum + x)
        max_sum = max(max_sum, current_sum)
    return max_sum

A = [904, 40, 523, 12, -335, -385, -124, 481, -31]

result = find_maximum_subarray(A)
print(f"Максимальная сумма подмассива: {result}")

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

Максимальная сумма подмассива: 1479

Как ΠΈ ΠΊΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ динамичСскоС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

Π”ΠŸ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ² Π·Π°Π΄Π°Ρ‡:

  • ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ β€” Π½Π°Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ максимального ΠΈΠ»ΠΈ минимального значСния.
  • ΠŸΠΎΠ΄ΡΡ‡Π΅Ρ‚ β€” Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, подсчСт количСства Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² достиТСния ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ Ρ†Π΅Π»ΠΈ.
  • ΠŸΡ€ΠΈΠ½ΡΡ‚ΠΈΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ β€” Π²Ρ‹Π±ΠΎΡ€ Π½Π°ΠΈΠ»ΡƒΡ‡ΡˆΠ΅Π³ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ².

Π’Π°ΠΆΠ½Ρ‹Π΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹:

  • РСкурсия ΠΈ итСрация. Π”ΠŸ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ рСкурсивно, Ρ‚Π°ΠΊ ΠΈ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎ. Иногда рСкурсия эффСктивнСС ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΠ³Π΄Π° Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ быстро ΠΈΠ»ΠΈ Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ количСство ΠΏΠΎΠ΄Π·Π°Π΄Π°Ρ‡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ отсСчСния. ΠŸΡ€ΠΈ этом кэш Ρ‡Π°Ρ‰Π΅ всСго строится снизу Π²Π²Π΅Ρ€Ρ…, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎ.
  • ИспользованиС кэша. Когда Π”ΠŸ рСализуСтся рСкурсивно, кэш ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ прСдставляСт собой Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΡƒΡŽ структуру Π΄Π°Π½Π½Ρ‹Ρ… β€” Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΈΠ»ΠΈ Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ΅ Π΄Π΅Ρ€Π΅Π²ΠΎ поиска. ΠŸΡ€ΠΈ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ кэш Ρ‡Π°Ρ‰Π΅ всСго прСдставляСт собой ΠΎΠ΄Π½ΠΎΠΌΠ΅Ρ€Π½Ρ‹ΠΉ ΠΈΠ»ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив. Π’ цСлях ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ мСсто Π² кэшС ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ, Ссли извСстно, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ большС Π½Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ.
  • РаспространСнная ошибка β€” ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ Π·Π°Π΄Π°Ρ‡Ρƒ Π½Π° Π΄Π²Π΅ Ρ€Π°Π²Π½Ρ‹Π΅ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρ‹, ΠΊΠ°ΠΊ Π² Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ΅ быстрой сортировки. Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв Ρ‚Π°ΠΊΠΎΠ΅ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡŽ.
  • Π”ΠŸ Π½Π΅ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎ β€” Π½Π΅ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ с Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ. НапримСр, Π² Π·Π°Π΄Π°Ρ‡Π΅ ΠΎ поискС самого Π΄Π»ΠΈΠ½Π½ΠΎΠ³ΠΎ ΠΏΡƒΡ‚ΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ Π³ΠΎΡ€ΠΎΠ΄Π°ΠΌΠΈ Π±Π΅Π· повторСния ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Ρ… Π³ΠΎΡ€ΠΎΠ΄ΠΎΠ², ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΠ΄ΠΏΡƒΡ‚ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π½Π΅ Π±Ρ‹Ρ‚ΡŒ Ρ‡Π°ΡΡ‚ΡŒΡŽ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΎΠ±Ρ‰Π΅Π³ΠΎ ΠΏΡƒΡ‚ΠΈ.
***

Как Ρ‰Π΅Π»ΠΊΠ°Ρ‚ΡŒ Π·Π°Π΄Π°Ρ‡ΠΊΠΈ ΠΊΠ°ΠΊ ΠΎΡ€Π΅ΡˆΠΊΠΈ?

Π—Π½Π°Π΅ΡˆΡŒ, Π² ΠΈΠ³Ρ€Π°Ρ… Π΅ΡΡ‚ΡŒ супСроруТиС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π΄Π΅Π»Π°Π΅Ρ‚ тСбя Π½Π΅ΠΏΠΎΠ±Π΅Π΄ΠΈΠΌΡ‹ΠΌ. Π’Π°ΠΊ Π²ΠΎΡ‚, курс «Алгоритмы ΠΈ структуры Π΄Π°Π½Π½Ρ‹Ρ…Β» – Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Ρ‚ΠΈΠΏΠ° Ρ‚Π°ΠΊΠΎΠ³ΠΎ супСроруТия для программистов. ПослС Π½Π΅Π³ΠΎ слоТныС Π·Π°Π΄Π°Ρ‡ΠΈ Ρ€Π°Π·Π½ΠΎΡΠΈΡˆΡŒ Π² ΠΏΡƒΡ… ΠΈ ΠΏΡ€Π°Ρ…! πŸ₯œπŸ’₯πŸ”¨

На курсС Ρ‚Ρ‹:

  • УзнаСшь ΠΎ популярных Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°Ρ… ΠΈ структурах Π΄Π°Π½Π½Ρ‹Ρ…
  • ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡˆΡŒ практичСский ΠΎΠΏΡ‹Ρ‚ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ слоТных алгоритмичСских Π·Π°Π΄Π°Ρ‡
  • ΠΠ°ΡƒΡ‡ΠΈΡˆΡŒΡΡ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΉ ΠΈ эффСктивный ΠΊΠΎΠ΄
***

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π·Π°Π΄Π°Ρ‡, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ эффСктивнСС всСго Ρ€Π΅ΡˆΠ°ΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π”ΠŸ

Π—Π°Π΄Π°Ρ‡Π° 1: АмСриканский Ρ„ΡƒΡ‚Π±ΠΎΠ»

Π’ амСриканском Ρ„ΡƒΡ‚Π±ΠΎΠ»Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ дСйствиС ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Ρ€Π°Π·Π½ΠΎΠΌΡƒ количСству ΠΎΡ‡ΠΊΠΎΠ²: 2 ΠΎΡ‡ΠΊΠ° (сэйфти), 3 ΠΎΡ‡ΠΊΠ° (Ρ„ΠΈΠ»Π΄-Π³ΠΎΠ») ΠΈΠ»ΠΈ 7 ΠΎΡ‡ΠΊΠΎΠ² (Ρ‚Π°Ρ‡Π΄Π°ΡƒΠ½). БущСствуСт мноТСство Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΉ ΠΈΠ· этих 2, 3 ΠΈ 7 ΠΎΡ‡ΠΊΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΈΡ‚ΠΎΠ³ΠΎΠ²Ρ‹ΠΉ счСт. НапримСр, для достиТСния счСта 12 Π΅ΡΡ‚ΡŒ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ:

  • 6 сэйфти (2 x 6 = 12)
  • 3 сэйфти ΠΈ 2 Ρ„ΠΈΠ»Π΄-Π³ΠΎΠ»Π° (2 x 3 + 3 x 2 = 12)
  • 1 сэйфти, 1 Ρ„ΠΈΠ»Π΄-Π³ΠΎΠ» ΠΈ 1 Ρ‚Π°Ρ‡Π΄Π°ΡƒΠ½ (2 x 1 + 3 x 1 + 7 x 1 = 12)
  • 4 Ρ„ΠΈΠ»Π΄-Π³ΠΎΠ»Π° (3 x 4 = 12)

НуТно Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΈΡ‚ΠΎΠ³ΠΎΠ²Ρ‹ΠΉ счСт ΠΈ доступныС значСния ΠΎΡ‡ΠΊΠΎΠ² Π·Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ дСйствия, ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ количСство Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΉ дСйствий, приводящих ΠΊ этому счСту.

РСшСниС

На ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Ρ€Π°Π·Π±ΠΎΡ€Π° нСбольшого ΠΈΡ‚ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ счСта ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ значСния. НапримСр, ΠΈΡ‚ΠΎΠ³ΠΎΠ²Ρ‹ΠΉ счСт 9 ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊ:

  • ΠΠ°Π±Ρ€Π°Ρ‚ΡŒ сначала 7 ΠΎΡ‡ΠΊΠΎΠ², Π·Π°Ρ‚Π΅ΠΌ 2 ΠΎΡ‡ΠΊΠ°.
  • ΠΠ°Π±Ρ€Π°Ρ‚ΡŒ сначала 6 ΠΎΡ‡ΠΊΠΎΠ², Π·Π°Ρ‚Π΅ΠΌ 3 ΠΎΡ‡ΠΊΠ°.
  • ΠΠ°Π±Ρ€Π°Ρ‚ΡŒ сначала 2 ΠΎΡ‡ΠΊΠ°, Π·Π°Ρ‚Π΅ΠΌ 7 ΠΎΡ‡ΠΊΠΎΠ².

ΠžΠ±ΠΎΠ±Ρ‰Π°Ρ это наблюдСниС, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ любой счСт s ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ, Ссли сначала ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ s – 2 ΠΎΡ‡ΠΊΠΎΠ² ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊ Π½ΠΈΠΌ 2 ΠΎΡ‡ΠΊΠ°, Π»ΠΈΠ±ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ s – 3 ΠΎΡ‡ΠΊΠΎΠ² ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ 3 ΠΎΡ‡ΠΊΠ°, Π»ΠΈΠ±ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ s – 7 ΠΎΡ‡ΠΊΠΎΠ² ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ 7 ΠΎΡ‡ΠΊΠΎΠ². Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для рСкурсивного вычислСния всСх Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ дСйствий, приводящих ΠΊ Π½ΡƒΠΆΠ½ΠΎΠΌΡƒ счСту.

Однако рСкурсивный ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€ всСх ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ Π·Π°Ρ‚Ρ€Π°Ρ‚Π½Ρ‹ΠΌ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. ВмСсто этого Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ динамичСскоС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. Для этого ΠΌΡ‹ создаСм Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив A, Π³Π΄Π΅ A[i][j] Ρ…Ρ€Π°Π½ΠΈΡ‚ количСство ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Π°ΡŽΡ‚ ΠΈΡ‚ΠΎΠ³ΠΎΠ²Ρ‹ΠΉ счСт j, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ i Ρ‚ΠΈΠΏΠΎΠ² ΠΈΠ³Ρ€ΠΎΠ²Ρ‹Ρ… дСйствий. НапримСр, A[1][12] Π±ΡƒΠ΄Π΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ количСство способов Π½Π°Π±Ρ€Π°Ρ‚ΡŒ 12 ΠΎΡ‡ΠΊΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ дСйствия Π½Π° 2 ΠΈ 3 ΠΎΡ‡ΠΊΠ°:

Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ этот массив, Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΉΡ‚ΠΈΡΡŒ ΠΏΠΎ всСм Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ ΠΈΡ‚ΠΎΠ³ΠΎΠ²Ρ‹ΠΌ счСтам ΠΈ Ρ‚ΠΈΠΏΠ°ΠΌ ΠΈΠ³Ρ€ΠΎΠ²Ρ‹Ρ… дСйствий. ΠŸΡ€ΠΈ этом каТдая ячСйка массива A[i][j] вычисляСтся ΠΊΠ°ΠΊ сумма количСства способов Π½Π°Π±Ρ€Π°Ρ‚ΡŒ счСт j Π±Π΅Π· использования Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Ρ‚ΠΈΠΏΠ° дСйствия ΠΈ количСства способов Π½Π°Π±Ρ€Π°Ρ‚ΡŒ счСт j – W[i] с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ дСйствия.

МоТно Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ строки массива A[i] ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ эффСктивно, Ссли ΡƒΡ‡Π΅ΡΡ‚ΡŒ ΡƒΠΆΠ΅ посчитанныС значСния ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… строк. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π½ΠΎΠ²ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° дСйствия Π½Π΅ придСтся ΠΏΠ΅Ρ€Π΅ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ всС с нуля, β€” Π½ΡƒΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ. Π­Ρ‚ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΈΠΌΠ΅Π΅Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ O(sn) ΠΈ ΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ O(sn), Π³Π΄Π΅ s β€” ΠΈΡ‚ΠΎΠ³ΠΎΠ²Ρ‹ΠΉ счСт, Π° n β€” количСство Ρ‚ΠΈΠΏΠΎΠ² ΠΈΠ³Ρ€ΠΎΠ²Ρ‹Ρ… дСйствий:

def num_comb_for_final_score(final_score, possible_scores):
    num_comb_for_score = [1] + [0] * final_score
    
    for play in possible_scores:
        for score in range(play, final_score + 1):
            num_comb_for_score[score] += num_comb_for_score[score - play]

    return num_comb_for_score[-1]

final_score = 12
possible_scores = [2, 3, 7]

result = num_comb_for_final_score(final_score, possible_scores)
print(f"ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΉ для достиТСния счeΡ‚Π° {final_score}: {result}")

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΉ для достиТСния счeΡ‚Π° 12: 4

Π—Π°Π΄Π°Ρ‡Π° 2: ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΎΠ² Π² массивС

ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ для подсчСта Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… способов Π΄ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ Π»Π΅Π²ΠΎΠ³ΠΎ ΡƒΠ³Π»Π° Π΄Π²ΡƒΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ массива Π΄ΠΎ Π½ΠΈΠΆΠ½Π΅Π³ΠΎ ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ ΡƒΠ³Π»Π°. ДопустимыС Ρ…ΠΎΠ΄Ρ‹ β€” Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²ΠΏΡ€Π°Π²ΠΎ ΠΈΠ»ΠΈ Π²Π½ΠΈΠ·. НапримСр, для массива Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ 5x5 сущСствуСт 70 Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΏΡƒΡ‚Π΅ΠΉ, Π½Π° рисункС ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ Ρ‚Ρ€ΠΈ ΠΈΠ· Π½ΠΈΡ…:

РСшСниС

ΠžΠ±ΠΎΠ·Π½Π°Ρ‡ΠΈΠΌ Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ Π»Π΅Π²Ρ‹ΠΉ ΡƒΠ³ΠΎΠ» ΠΊΠ°ΠΊ (0, 0). Π’ΠΎΠ³Π΄Π° количСство способов Π΄ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π΄ΠΎ любой ячСйки (i, j) ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ сумму количСства способов Π΄ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π΄ΠΎ ячСйки свСрху (i-1, j) ΠΈ слСва (i, j-1). Если i = 0 ΠΈΠ»ΠΈ j = 0, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Ссли ΠΌΡ‹ находимся Π½Π° Π³Ρ€Π°Π½ΠΈΡ†Π΅ массива, Ρ‚ΠΎ Π΄ΠΎ этой ячСйки ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΈΠΌ способом β€” двигаясь Π»ΠΈΠ±ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²ΠΏΡ€Π°Π²ΠΎ, Π»ΠΈΠ±ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π½ΠΈΠ·. НаивноС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅Π±Ρ€Π°Ρ‚ΡŒ всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ ΠΏΡƒΡ‚ΠΈ. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ рСкурсии, Π½ΠΎ количСство ΠΏΡƒΡ‚Π΅ΠΉ быстро возрастаСт с ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° массива, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ нСэффСктивным ΠΈΠ·-Π·Π° ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎΠΉ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ слоТности. ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ это Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ Π² ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ number_of_ways, которая Π² ΠΈΡ‚ΠΎΠ³Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π° Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΎΠ² ΠΎΡ‚ (0, 0) Π΄ΠΎ (i, j) ΠΏΡ€ΠΈ 0 ≀ i, j ≀ 4
def number_of_ways(n, m):
    def compute_number_of_ways_to_xy(x, y):
        if x == y == 0:
            return 1
        if number_of_ways[x][y] == 0:
            ways_top = 0 if x == 0 else compute_number_of_ways_to_xy(x - 1, y)
            ways_left = 0 if y == 0 else compute_number_of_ways_to_xy(x, y - 1)
            number_of_ways[x][y] = ways_top + ways_left
        return number_of_ways[x][y]

    number_of_ways = [[0] * m for _ in range(n)]
    return compute_number_of_ways_to_xy(n - 1, m - 1)

n = m = 5
result = number_of_ways(n, m)
print(f"ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΎΠ²: {result}")

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΎΠ²: 70

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: эту Π·Π°Π΄Π°Ρ‡Ρƒ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ аналитичСски. Бпособ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ количСство ΠΏΡƒΡ‚Π΅ΠΉ ΠΊΠ°ΠΊ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ ΠΈΠ· n – 1 Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… шагов ΠΈ m – 1 Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½Ρ‹Ρ… шагов. ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ биномиального коэффициСнта:

(n+mβˆ’2nβˆ’1)=(n+mβˆ’2mβˆ’1)=(n+mβˆ’2)!(nβˆ’1)!(mβˆ’1)!
import math

def number_of_paths(n, m):
    return math.comb(n + m - 2, m - 1)

n = m = 5
print(f"ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΎΠ² для массива {n}x{m}: {number_of_paths(n, m)}")

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΎΠ² для массива 5x5: 70
🐍 Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° питониста
Π‘ΠΎΠ»ΡŒΡˆΠ΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ² Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° питониста»
πŸπŸŽ“ Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Python для собСса
ΠŸΠΎΠ΄Ρ‚ΡΠ½ΡƒΡ‚ΡŒ свои знания ΠΏΠΎ Python Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Python для собСса»
🐍🧩 Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π·Π°Π΄Π°Ρ‡ ΠΏΠΎ Python
Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΏΠΎ Python для ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π·Π°Π΄Π°Ρ‡ ΠΏΠΎ PythonΒ»

Π—Π°Π΄Π°Ρ‡Π° 3: Поиск ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π° Π² 2D-массивС

ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, которая ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π½Π° Π²Ρ…ΠΎΠ΄ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ (2D-массив) ΠΈ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ (ΠΎΠ΄Π½ΠΎΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив), ΠΈ провСряСт, встрСчаСтся Π»ΠΈ этот ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ Π² 2D-массивС. БчитаСтся, Ρ‡Ρ‚ΠΎ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ встрСчаСтся Π² ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅, Ссли входящиС Π² ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ числа ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ ΠΏΡƒΡ‚Π΅ΠΌ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ пСрСмСщСния ΠΏΠΎ сосСдним ячСйкам (Π²Π²Π΅Ρ€Ρ…, Π²Π½ΠΈΠ·, Π²Π»Π΅Π²ΠΎ, Π²ΠΏΡ€Π°Π²ΠΎ). К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ (1, 3, 4, 6) Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΡƒΡŽ Π½Π° рисункС ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ, Π° (1, 2, 3, 4) β€” Π½Π΅Ρ‚:

Π—Π°Π΄Π°Ρ‡Π° 3: Поиск ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π° Π² 2D-массивС

РСшСниС

Для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡ΠΈ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΊΠ°Ρ‚ΡŒ Π² ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Ρƒ, начиная с ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ элСмСнта ΠΈ провСряя всС ячСйки ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ. Если ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π° совпадаСт с элСмСнтом Π² ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅, провСряСм, ΠΌΠΎΠΆΠ΅ΠΌ Π»ΠΈ ΠΌΡ‹ Π½Π°ΠΉΡ‚ΠΈ ΠΎΡΡ‚Π°Π²ΡˆΡƒΡŽΡΡ Ρ‡Π°ΡΡ‚ΡŒ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π°, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°ΡΡΡŒ ΠΏΠΎ сосСдним ячСйкам. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ рСкурсивного ΠΎΠ±Ρ…ΠΎΠ΄Π°. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ Ρ‚Π΅Ρ… ΠΆΠ΅ участков, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ этого Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π²Π½Π° O(nm|d|), Π³Π΄Π΅ d β€” Π΄Π»ΠΈΠ½Π° ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π°.

def is_pattern_in_matrix(matrix, pattern):
    def search_pattern(x, y, offset):
        if len(pattern) == offset:
            return True
        
        if (0 <= x < len(matrix) and 0 <= y < len(matrix[x]) and
            matrix[x][y] == pattern[offset] and (x, y, offset) not in previous_attempts and
            any(search_pattern(x + a, y + b, offset + 1)
                for a, b in ((-1, 0), (1, 0), (0, -1), (0, 1)))):
            return True
        
        previous_attempts.add((x, y, offset))
        return False

    previous_attempts = set()
    
    return any(search_pattern(i, j, 0)
               for i in range(len(matrix))
               for j in range(len(matrix[i])))


matrix = [[1, 2, 3],
          [3, 4, 5],
          [5, 6, 7]]

pattern = [1, 3, 4, 6, 7]

print(is_pattern_in_matrix(matrix, pattern))  

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

True

Π—Π°Π΄Π°Ρ‡Π° 4: ΠŸΡƒΡ‚ΡŒ с наимСньшим вСсом

Π”Π°Π½Π° Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½Π°Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ чисСл. ВрСбуСтся Π½Π°ΠΉΡ‚ΠΈ ΠΏΡƒΡ‚ΡŒ с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ вСсом, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ начинаСтся с Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° ΠΈ спускаСтся Π²Π½ΠΈΠ·, пСрСходя Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° сосСдниС элСмСнты ΠΏΠΎ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΠΈ ΠΈΠ»ΠΈ Π΄ΠΈΠ°Π³ΠΎΠ½Π°Π»ΠΈ, ΠΈ заканчиваСтся Π½Π° Π½ΠΈΠΆΠ½Π΅ΠΌ ряду. ВСс ΠΏΡƒΡ‚ΠΈ опрСдСляСтся ΠΊΠ°ΠΊ сумма элСмСнтов этого ΠΏΡƒΡ‚ΠΈ. На ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ рисункС ΠΏΡƒΡ‚ΡŒ с наимСньшим вСсом 15 Π²Ρ‹Π΄Π΅Π»Π΅Π½ красным:

Π—Π°Π΄Π°Ρ‡Π° 4: ΠŸΡƒΡ‚ΡŒ с наимСньшим вСсом

РСшСниС

ВмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ ΠΏΡƒΡ‚ΠΈ (Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π»ΠΎ Π±Ρ‹ ΠΊ ΡΠΊΡΠΏΠΎΠ½Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ слоТности), ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ постСпСнно, начиная с Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ ряда Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° ΠΈ двигаясь Π²Π½ΠΈΠ·, вычисляя ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ вСс ΠΏΡƒΡ‚ΠΈ Π΄ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ.

НачнСм с ΠΏΠ΅Ρ€Π²ΠΎΠΉ строки Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°, Π³Π΄Π΅ ΠΏΡƒΡ‚ΡŒ с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ вСсом Π΄ΠΎ СдинствСнного элСмСнта Ρ€Π°Π²Π΅Π½ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ этого элСмСнта. Для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ строки Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° Π±ΡƒΠ΄Π΅ΠΌ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ вСс ΠΏΡƒΡ‚ΠΈ Π΄ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта этой строки, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ вСса ΠΏΡƒΡ‚Π΅ΠΉ Π΄ΠΎ элСмСнтов ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ строки. ВрСмСнная ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ этого Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ β€” O(n2), пространствСнная β€” O(n).

def minimum_path_weight(triangle):
    min_weight_to_curr_row = [0]
    
    for row in triangle:
        min_weight_to_curr_row = [
            row[j] + 
            min(
                min_weight_to_curr_row[max(j - 1, 0)],
                min_weight_to_curr_row[min(j, len(min_weight_to_curr_row) - 1)]
            )
            for j in range(len(row))
        ]
    
    return min(min_weight_to_curr_row)

triangle = [[2],
           [4, 4],
           [8, 5, 6],
           [4, 2, 6, 2],
           [1, 5, 2, 3, 4]]

print(f"ΠŸΡƒΡ‚ΡŒ с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ вСсом: {minimum_path_weight(triangle)}")

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

ΠŸΡƒΡ‚ΡŒ с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ вСсом: 15

Π—Π°Π΄Π°Ρ‡Π° 5: ЛСстница

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°Π΅Ρ‚Π΅ΡΡŒ ΠΏΠΎ лСстницС, ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ Π·Π° ΠΎΠ΄ΠΈΠ½ шаг ΠΎΡ‚ 1 Π΄ΠΎ k ступСнСй. Π’Π°ΡˆΠ° Ρ†Π΅Π»ΡŒ β€” ΠΏΠΎΠ΄Π½ΡΡ‚ΡŒΡΡ Π½Π° Ρ‚ΠΎΡ‡Π½ΠΎ n ступСнСй. ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π½Π° Π²Ρ…ΠΎΠ΄ числа n ΠΈ k ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ количСство способов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹. НапримСр, Ссли n = 4 ΠΈ k = 2, Ρ‚ΠΎ сущСствуСт 5 способов ΠΏΠΎΠ΄Π½ΡΡ‚ΡŒΡΡ Π½Π° Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ:

  • Π§Π΅Ρ‚Ρ‹Ρ€Π΅ Ρ€Π°Π·Π° ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ ступСни.
  • Π”Π²Π° Ρ€Π°Π·Π° ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ ступСни, Π·Π°Ρ‚Π΅ΠΌ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· Π½Π° Π΄Π²Π΅ ступСни.
  • Один Ρ€Π°Π· Π½Π° ΠΎΠ΄Π½Ρƒ ΡΡ‚ΡƒΠΏΠ΅Π½ΡŒ, Π·Π°Ρ‚Π΅ΠΌ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· Π½Π° Π΄Π²Π΅ ступСни, ΠΈ снова Π½Π° ΠΎΠ΄Π½Ρƒ ΡΡ‚ΡƒΠΏΠ΅Π½ΡŒ.
  • Один Ρ€Π°Π· Π½Π° Π΄Π²Π΅ ступСни, Π·Π°Ρ‚Π΅ΠΌ Π΄Π²Π° Ρ€Π°Π·Π° ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ ступСни.
  • Π”Π²Π° Ρ€Π°Π·Π° ΠΏΠΎ Π΄Π²Π΅ ступСни.

РСшСниС

ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ способов Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ лСстницы, учитывая, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ шаг ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚ 1 Π΄ΠΎ k ступСнСк, ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· рСкурсивноС ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅:

F(n,k)=βˆ‘i=1kF(nβˆ’i,k)

ВСрнСмся ΠΊ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌΡƒ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ ΠΈ вычислим количСство способов Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ 4-ΠΉ ΡΡ‚ΡƒΠΏΠ΅Π½ΡŒΠΊΠΈ лСстницы, дСлая шаги Π΄Π»ΠΈΠ½ΠΎΠΉ максимум 2.

НачнСм с F(4,2): F(4,2) = F(4-2,2) + F(4-1,2) F(4,2) = F(2,2) + F(3,2). Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρ€Π°Π·Π»ΠΎΠΆΠΈΠΌ F(2,2): F(2,2) = F(2-2,2) + F(2-1,2) F(2,2) = F(0,2) + F(1,2). Π—Π΄Π΅ΡΡŒ Ρƒ нас Π΅ΡΡ‚ΡŒ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ случаи: F(0,2) = 1 (Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ способ Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ Π½ΡƒΠ»Π΅Π²ΠΎΠΉ ΡΡ‚ΡƒΠΏΠ΅Π½ΡŒΠΊΠΈ β€” Π½Π΅ Π΄Π΅Π»Π°Ρ‚ΡŒ шагов) ΠΈ F(1,2) = 1 (Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ способ Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΡΡ‚ΡƒΠΏΠ΅Π½ΡŒΠΊΠΈ β€” ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ шаг Π΄Π»ΠΈΠ½ΠΎΠΉ 1).

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ F(3,2): F(3,2) = F(3-2,2) + F(3-1,2) F(3,2) = F(1,2) + F(2,2). ΠœΡ‹ ΡƒΠΆΠ΅ Π·Π½Π°Π΅ΠΌ эти значСния:

  • F(1,2) = 1 (Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ случай).
  • F(2,2) = 2 (вычислСно Ρ€Π°Π½Π΅Π΅).

Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, F(3,2) = 1 + 2 = 3. НаконСц, подставляСм значСния ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² F(4,2): F(4,2) = F(2,2) + F(3,2) = 2 + 3 = 5.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, сущСствуСт 5 способов Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ 4-ΠΉ ΡΡ‚ΡƒΠΏΠ΅Π½ΡŒΠΊΠΈ лСстницы.

Для ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ пространствСнной слоТности ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ массив для хранСния количСства способов Π΄ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π΄ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ступСни, начиная с ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΈ Π΄ΠΎ n. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт массива Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ количСство способов Π΄ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π΄ΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ступСни, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… вычислСний. ВрСмСнная ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π²Π½Π° O(nk):

def number_of_ways_to_top(n, k):
    number_of_ways_to_h = [0] * (n + 1)
    number_of_ways_to_h[0] = 1  

    for i in range(1, n + 1):
        number_of_ways_to_h[i] = sum(number_of_ways_to_h[i - j] for j in range(1, min(k, i) + 1))

    return number_of_ways_to_h[n]


n = 4
k = 2
result = number_of_ways_to_top(n, k)
print(f"ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ способов Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ {n}-ΠΉ ΡΡ‚ΡƒΠΏΠ΅Π½ΡŒΠΊΠΈ с ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ шагом {k}: {result}")

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ способов Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ 4-ΠΉ ΡΡ‚ΡƒΠΏΠ΅Π½ΡŒΠΊΠΈ с ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ шагом 2: 5

Π—Π°Π΄Π°Ρ‡Π° 6: Бамая длинная Π½Π΅ΡƒΠ±Ρ‹Π²Π°ΡŽΡ‰Π°Ρ ΠΏΠΎΠ΄ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° нахоТдСния самой Π΄Π»ΠΈΠ½Π½ΠΎΠΉ Π½Π΅ΡƒΠ±Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ ΠΏΠΎΠ΄ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Ρ†Π΅Π»Ρ‹Ρ… чисСл встрСчаСтся Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… сфСрах, ΠΎΡ‚ Π°Π½Π°Π»ΠΈΠ·Π° тСкста Π΄ΠΎ Π»ΠΎΠ³ΠΈΠΊΠΈ ΠΊΠ°Ρ€Ρ‚ΠΎΡ‡Π½Ρ‹Ρ… ΠΈΠ³Ρ€. НапримСр, для массива Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π΄Π»ΠΈΠ½Π° самой Π΄Π»ΠΈΠ½Π½ΠΎΠΉ Π½Π΅Π²ΠΎΠ·Ρ€Π°ΡΡ‚Π°ΡŽΡ‰Π΅ΠΉ ΠΏΠΎΠ΄ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Ρ€Π°Π²Π½Π° 4, ΠΈ Ρ‚Π°ΠΊΠΈΡ… ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ нСсколько: (0, 8, 12, 14); (0, 4, 6, 9); (0, 2, 10, 14) β€” элСмСнты ΠΏΠΎΠ΄ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ располоТСны рядом:

Π—Π°Π΄Π°Ρ‡Π° 6: Бамая длинная Π½Π΅ΡƒΠ±Ρ‹Π²Π°ΡŽΡ‰Π°Ρ ΠΏΠΎΠ΄ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ

ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ для поиска самой Π΄Π»ΠΈΠ½Π½ΠΎΠΉ Π½Π΅ΡƒΠ±Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ ΠΏΠΎΠ΄ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π² ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠΌ массивС Ρ†Π΅Π»Ρ‹Ρ… чисСл.

РСшСниС

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ массив L, Π³Π΄Π΅ L[i] Π±ΡƒΠ΄Π΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π΄Π»ΠΈΠ½Ρƒ самой Π΄Π»ΠΈΠ½Π½ΠΎΠΉ Π½Π΅Π²ΠΎΠ·Ρ€Π°ΡΡ‚Π°ΡŽΡ‰Π΅ΠΉ ΠΏΠΎΠ΄ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, ΠΎΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‰Π΅ΠΉΡΡ Π² индСксС i:

  • L[0] = 1 (Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π½Π΅Ρ‚ элСмСнтов ΠΏΠ΅Ρ€Π΅Π΄ элСмСнтом 0)
  • L[1] = 1 + max⁑(L[0]) = 2 (Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ A[0] ≀ A[1])
  • L[2] = 1 + max⁑(L[0]) = 2 (Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ A[0] ≀ A[2] ΠΈ A[1] > A[2])
  • L[3] = 1 + max⁑(L[0], L[1], L[2]) = 3 (Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ A[0], A[1] ≀A[3] ΠΈ A[2] ≀ A[3])
  • L[4] = 1 + max⁑(L[0]) = 2 (Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ A[0] ≀ A[4], A[1], A[2] ΠΈ A[3] > A[4])
  • L[5] = 1 + max⁑(L[0], L[1], L[2], L[4]) = 3 (Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ A[0], A[1], A[2], A[4] ≀ A[5] ΠΈ A[3] > A[5])
  • L[6] = 1 + max⁑(L[0], L[2], L[4]) = 3 (Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ A[0], A[2], A[4] ≀ A[6] ΠΈ A[1], A[3], A[5] > A[6])
  • L[7 ] = 1 + max⁑(L[0], L[1], L[2], L[3], L[4], L[5], L[6]) = 4 (Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ A[0], A[1], A[2], A[3], A[4], A[5], A[6] ≀ A[7])
  • L[8] = 1 + max⁑(L[0]) = 2 (Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ A[0] ≀ A[8] ΠΈ A[1], A[2], A[3], A[4], A[5], A[6], A[7] > A[8])
  • L[9] = 1 + max⁑(L[0], L[1], L[2], L[4], L[6], L[8]) = 4 (Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ A[0], A[1], A[2], A[4], A[6], A[8] ≀ A[9])

ВрСмСнная ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ β€” O(n2):

def max_nondecreasing_sub(A):
    max_length = [1] * len(A)
    for i in range(1, len(A)):
        max_length[i] = max(1 + max(
            [max_length[j] for j in range(i)
             if A[i] >= A[j]], default=0), max_length[i])
    return max(max_length)

A = [0, 8, 4, 12, 2, 10, 6, 14, 1, 9]
print(f"Наибольшая Π΄Π»ΠΈΠ½Π° Π½Π΅ΡƒΠ±Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ ΠΏΠΎΠ΄ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Ρ€Π°Π²Π½Π° {max_nondecreasing_sub(A)}")

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

Наибольшая Π΄Π»ΠΈΠ½Π° Π½Π΅ΡƒΠ±Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ ΠΏΠΎΠ΄ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Ρ€Π°Π²Π½Π° 4

Π—Π°Π΄Π°Ρ‡Π° 7: Π‘ΠΈΠ½ΠΎΠΌΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ коэффициСнт

Π‘ΠΈΠ½ΠΎΠΌΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ коэффициСнт опрСдСляСт количСство способов Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ k-элСмСнтноС подмноТСство ΠΈΠ· n-элСмСнтного мноТСства:

(nk)=n(nβˆ’1)…(nβˆ’k+1)k(kβˆ’1)…3β‹…2β‹…1

Основная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ссли ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ это число Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒΡΡ с ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ β€” ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Π΅ вычислСния становятся слишком большими для хранСния Π² Ρ‚ΠΈΠΏΠΈΡ‡Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. НапримСр, Π΄Π°ΠΆΠ΅ Ссли ΠΈΡ‚ΠΎΠ³ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ помСстится Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°, ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€Π΅Π²Ρ‹ΡΠΈΡ‚ΡŒ допустимый Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½.

НуТно ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈ вычислСнии биномиального коэффициСнта Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ, Ссли ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ вписываСтся Π² допустимыС Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, 32-Π±ΠΈΡ‚Π½ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅ число.

РСшСниС

Π‘ΠΈΠ½ΠΎΠΌΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ коэффициСнт ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ ΠΏΠΎ Ρ„ΠΎΡ€ΠΌΡƒΠ»Π΅:

(nk)=(nβˆ’1k)+(nβˆ’1kβˆ’1)

Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ вычислСния ΠΏΠΎ этой Ρ„ΠΎΡ€ΠΌΡƒΠ»Π΅ для (5, 3):

  • Π‘Π°Π·ΠΎΠ²Ρ‹Π΅ случаи (n, 0) ΠΈ (n, n) всСгда Ρ€Π°Π²Π½Ρ‹ 1, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ способ Π½Π΅ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π½ΠΈΡ‡Π΅Π³ΠΎ ΠΈΠ»ΠΈ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ всС сразу.
  • (5, 3) = (4, 2) + (4, 3)
  • (4, 2) = (3, 1) + (3, 2)
  • (4, 3) = (3, 2) + (3, 3)
  • (3, 1) = (2, 0) + (2, 1) = 1 + 2 = 3
  • (3, 2) = (2, 1) + (2, 2) = 2 + 1 = 3
  • (4, 2) = 3 + 3 = 6
  • (4, 3) = 3 + 1 = 4
  • (5, 3) = 6 + 4 = 10

Для ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ слоТности Π΄ΠΎ O(nk) Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅ΠΌΠΎΠΈΠ·Π°Ρ†ΠΈΡŽ (ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Ρ… Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ²):

def binomial_coefficient(n, k):
    def compute_x_choose_y(x, y):
        if y in (0, x):
            return 1
        if x_choose_y[x][y] == 0:
            without_y = compute_x_choose_y(x - 1, y)
            with_y = compute_x_choose_y(x - 1, y - 1)
            x_choose_y[x][y] = without_y + with_y
        return x_choose_y[x][y]

    x_choose_y = [[0] * (k + 1) for _ in range(n + 1)]
    return compute_x_choose_y(n, k)

n = 5
k = 3
print(binomial_coefficient(n, k))

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

10

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

ДинамичСскоС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠ³ΠΎ понимания структуры Π·Π°Π΄Π°Ρ‡ΠΈ ΠΈ умСния Π²Ρ‹ΡΠ²Π»ΡΡ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΠ΅ΡΡ ΠΏΠΎΠ΄Π·Π°Π΄Π°Ρ‡ΠΈ. ΠŸΡ€ΠΎΡ†Π΅ΡΡ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° с использованиСм Π”ΠŸ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ нСсколько Π²Π°ΠΆΠ½Ρ‹Ρ… шагов:

  • НСобходимо ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ структуру ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΠΎΠ΄Π·Π°Π΄Π°Ρ‡ΠΈ.
  • Π—Π°Ρ‚Π΅ΠΌ слСдуСт ΡΡ„ΠΎΡ€ΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅ΠΊΡƒΡ€Ρ€Π΅Π½Ρ‚Π½ΠΎΠ΅ ΡΠΎΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅, ΡΠ²ΡΠ·Ρ‹Π²Π°ΡŽΡ‰Π΅Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΠΎΠ΄Π·Π°Π΄Π°Ρ‡ с Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ исходной Π·Π°Π΄Π°Ρ‡ΠΈ.
  • ПослС этого Π²Π°ΠΆΠ½ΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΡƒΡŽ ΡΡ‚Ρ€Π°Ρ‚Π΅Π³ΠΈΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ β€” ΠΎΡ‚ простой рСкурсии с ΠΌΠ΅ΠΌΠΎΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ эффСктивного ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° с Ρ‚Π°Π±Π»ΠΈΡ‡Π½Ρ‹ΠΌ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ.

Π’Π°ΠΊΠΆΠ΅ Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ нСсмотря Π½Π° свою ΠΌΠΎΡ‰ΡŒ, Π”ΠŸ Π½Π΅ являСтся ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ: Π΅Π³ΠΎ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ зависит ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Π°Ρ€ΡŒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ случая ΠΊ ΡΠ»ΡƒΡ‡Π°ΡŽ. Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ситуациях ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π”ΠŸ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π½ΠΎΠΌΡƒ использованию памяти ΠΈΠ»ΠΈ ΡƒΡΠ»ΠΎΠΆΠ½Π΅Π½ΠΈΡŽ ΠΊΠΎΠ΄Π° Π±Π΅Π· Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ° Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

Π›Π£Π§Π¨Π˜Π• БВАВЬИ ПО Π’Π•ΠœΠ•

admin
11 дСкабря 2018

ООП Π½Π° Python: ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ, ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Python допускаСт Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ»ΠΎΠ³ΠΈΠΈ, Π½ΠΎ Π² Π΅Π³ΠΎ основС...
admin
08 октября 2017

13 рСсурсов, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΡƒ

Π‘Ρ€Π΅Π΄ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² часто Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ споры ΠΎ Ρ‚ΠΎΠΌ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π»ΠΈ ΠΈΠ·ΡƒΡ‡Π°Ρ‚ΡŒ ΠΌΠ°Ρ‚Π΅...
admin
13 фСвраля 2017

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Python: ΠΎΡ‚ Π½ΠΎΠ²ΠΈΡ‡ΠΊΠ° Π΄ΠΎ профСссионала

Пошаговая инструкция для всСх, ΠΊΡ‚ΠΎ Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒΒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Python...