π 25 Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠ² Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π½Π°ΡΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡ
Π ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ 25 ΠΎΡΠ½ΠΎΠ²Π½ΡΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠ² Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ Π½Π° Python, ΠΊΠΎΡΠΎΡΡΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π½Π°ΡΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ, ΠΊΡΠΎ ΡΠ²Π»Π΅ΠΊΠ°Π΅ΡΡΡ ΡΠΏΠΎΡΡΠΈΠ²Π½ΡΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ.
ΠΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ β ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄ Π² ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ½ΡΡ Π½Π°ΡΠΊΠ°Ρ ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΠ³ΡΠ°Π΅Ρ ΡΠ΅ΡΠ°ΡΡΡΡ ΡΠΎΠ»Ρ Π² ΡΠΏΠΎΡΡΠΈΠ²Π½ΠΎΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ. ΠΡΠΎ ΠΌΠ΅ΡΠΎΠ΄ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΠ»ΠΎΠΆΠ½ΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΠΏΡΡΠ΅ΠΌ ΠΈΡ ΡΠ°Π·Π±ΠΈΠ΅Π½ΠΈΡ Π½Π° Π±ΠΎΠ»Π΅Π΅ ΠΌΠ΅Π»ΠΊΠΈΠ΅ ΠΏΠΎΠ΄Π·Π°Π΄Π°ΡΠΈ ΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠΎΠ΄Π·Π°Π΄Π°ΡΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π· Ρ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ΠΌ ΡΠ΅ΡΠ΅Π½ΠΈΠΉ ΠΏΠΎΠ΄Π·Π°Π΄Π°Ρ, ΡΡΠΎΠ±Ρ ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ. Π ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ Π°Π»Π³ΠΎΡΠΈΡΠΌΡ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π½Π°ΡΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ, ΠΊΡΠΎ ΡΠ²Π»Π΅ΠΊΠ°Π΅ΡΡΡ ΡΠΏΠΎΡΡΠΈΠ²Π½ΡΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ.
1. Π§ΠΈΡΠ»Π° Π€ΠΈΠ±ΠΎΠ½Π°ΡΡΠΈ
ΠΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π€ΠΈΠ±ΠΎΠ½Π°ΡΡΠΈ β ΡΡΠΎ Ρ
ΠΎΡΠΎΡΠΎ ΠΈΠ·Π²Π΅ΡΡΠ½Π°Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΡΠΈΡΠ΅Π», ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌΠ°Ρ ΡΠ΅ΠΊΡΡΡΠ΅Π½ΡΠ½ΡΠΌ ΡΠΎΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ΠΌ F(n) = F(n-1) + F(n-2)
, Π³Π΄Π΅ F(0) = 0
ΠΈ F(1) = 1
. ΠΡΠΎΡΡΡΠΌ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΡΠΌ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠΌ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ ΡΠΈΡΠ΅Π» Π€ΠΈΠ±ΠΎΠ½Π°ΡΡΠΈ Π±ΡΠ»ΠΎ Π±Ρ ΠΏΡΡΠΌΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ΅ΠΊΡΡΡΠ΅Π½ΡΠ½ΠΎΠ³ΠΎ ΡΠΎΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΡ, Π½ΠΎ ΡΡΠΎ ΠΏΡΠΈΠ²Π΅Π»ΠΎ Π±Ρ ΠΊ ΡΠΊΡΠΏΠΎΠ½Π΅Π½ΡΠΈΠ°Π»ΡΠ½ΠΎΠΉ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΠΈ. ΠΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ΅ΡΠΈΡΡ ΡΡΡ Π·Π°Π΄Π°ΡΡ Π·Π° Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΠ΅ΠΌΠΎΠΈΠ·Π°ΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠΎΡ
ΡΠ°Π½ΡΠ΅Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ ΡΠΆΠ΅ ΡΠ΅ΡΠ΅Π½Π½ΡΡ
ΠΏΠΎΠ΄Π·Π°Π΄Π°Ρ.
def fibonacci(n, memo): if n in memo: return memo[n] if n <= 1: memo[n] = n else: memo[n] = fibonacci(n-1, memo) + fibonacci(n-2, memo) return memo[n]
2. Π‘Π°ΠΌΠ°Ρ Π΄Π»ΠΈΠ½Π½Π°Ρ ΠΎΠ±ΡΠ°Ρ ΠΏΠΎΠ΄ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ
ΠΠ°Π΄Π°ΡΠ° ΠΎ ΡΠ°ΠΌΠΎΠΉ Π΄Π»ΠΈΠ½Π½ΠΎΠΉ ΠΎΠ±ΡΠ΅ΠΉ ΠΏΠΎΠ΄ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ (LCS) β ΡΡΠΎ ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠ°Ρ Π·Π°Π΄Π°ΡΠ° Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΠΊΠ»ΡΡΠ°Π΅Ρ Π² ΡΠ΅Π±Ρ ΠΏΠΎΠΈΡΠΊ ΡΠ°ΠΌΠΎΠΉ Π΄Π»ΠΈΠ½Π½ΠΎΠΉ ΠΏΠΎΠ΄ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ, ΠΎΠ±ΡΠ΅ΠΉ Π΄Π»Ρ Π΄Π²ΡΡ Π·Π°Π΄Π°Π½Π½ΡΡ ΡΡΡΠΎΠΊ. ΠΠΎΠ΄ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΡΡΡΠΎΠΊΠΈ β ΡΡΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΡΠ²Π»ΡΡΡΡΡ Π² ΡΡΡΠΎΠΊΠ΅ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈ ΡΠΎΠΌ ΠΆΠ΅ ΠΏΠΎΡΡΠ΄ΠΊΠ΅, Π½ΠΎ Π½Π΅ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ.
def lcs(s1, s2): m, n = len(s1), len(s2) dp = [[0] * (n+1) for _ in range(m+1)] for i in range(1, m+1): for j in range(1, n+1): if s1[i-1] == s2[j-1]: dp[i][j] = dp[i-1][j-1] + 1 else: dp[i][j] = max(dp[i-1][j], dp[i][j-1]) return dp[m][n]
3. ΠΠ°Π΄Π°ΡΠ° ΠΎ ΡΡΠΊΠ·Π°ΠΊΠ΅
ΠΠ°Π΄Π°ΡΠ° ΠΎ ΡΡΠΊΠ·Π°ΠΊΠ΅ β ΡΡΠΎ ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠ°Ρ Π·Π°Π΄Π°ΡΠ° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΠΊΠ»ΡΡΠ°Π΅Ρ Π² ΡΠ΅Π±Ρ ΠΏΠΎΠΈΡΠΊ ΠΎΠΏΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° ΠΏΡΠ΅Π΄ΠΌΠ΅ΡΠΎΠ² Π΄Π»Ρ ΡΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ Π² ΡΡΠΊΠ·Π°ΠΊ Ρ ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠΉ Π²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΡΡ, ΡΡΠΎΠ±Ρ ΠΌΠ°ΠΊΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ΅Π½Π½ΠΎΡΡΡ ΡΠΏΠ°ΠΊΠΎΠ²Π°Π½Π½ΡΡ ΠΏΡΠ΅Π΄ΠΌΠ΅ΡΠΎΠ².
def knapsack(W, wt, val, n): dp = [[0] * (W+1) for _ in range(n+1)] for i in range(1, n+1): for w in range(1, W+1): if wt[i-1] <= w: dp[i][w] = max(val[i-1] + dp[i-1][w-wt[i-1]], dp[i-1][w]) else: dp[i][w] = dp[i-1][w] return dp[n][W]
4. Π Π°ΡΡΡΠΎΡΠ½ΠΈΠ΅ ΠΠ΅Π²Π΅Π½ΡΡΠ΅ΠΉΠ½Π° (ΡΠ΅Π΄Π°ΠΊΡΠΈΠΎΠ½Π½ΠΎΠ΅ ΡΠ°ΡΡΡΠΎΡΠ½ΠΈΠ΅)
ΠΠ°Π΄Π°ΡΠ° ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠ°ΡΡΡΠΎΡΠ½ΠΈΡ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² Π½Π°Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΠΈ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΡ Π΄Π»Ρ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΠΎΠ΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ Π² Π΄ΡΡΠ³ΡΡ. ΠΠΎΠΏΡΡΡΠΈΠΌΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ: Π²ΡΡΠ°Π²ΠΊΠ°, ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΈ Π·Π°ΠΌΠ΅Π½Π°.
def edit_distance(s1, s2): m, n = len(s1), len(s2) dp = [[0] * (n+1) for _ in range(m+1)] for i in range(m+1): for j in range(n+1): if i == 0: dp[i][j] = j elif j == 0: dp[i][j] = i elif s1[i-1] == s2[j-1]: dp[i][j] = dp[i-1][j-1] else: dp[i][j] = 1 + min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) return dp[m][n]
5. Π‘Π°ΠΌΡΠΉ Π±ΠΎΠ»ΡΡΠΎΠΉ ΠΏΠΎΠ΄ΠΌΠ°ΡΡΠΈΠ²
ΠΠ°Π΄Π°ΡΠ° ΠΎ ΡΠ°ΠΌΠΎΠΌ Π±ΠΎΠ»ΡΡΠΎΠΌ ΠΏΠΎΠ΄ΠΌΠ°ΡΡΠΈΠ²Π΅ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΠΏΠΎΠΈΡΠΊΠ΅ Π½Π΅ΠΏΡΠ΅ΡΡΠ²Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΌΠ°ΡΡΠΈΠ²Π° Π² ΠΎΠ΄Π½ΠΎΠΌΠ΅ΡΠ½ΠΎΠΌ ΠΌΠ°ΡΡΠΈΠ²Π΅ ΡΠΈΡΠ΅Π» Ρ Π½Π°ΠΈΠ±ΠΎΠ»ΡΡΠ΅ΠΉ ΡΡΠΌΠΌΠΎΠΉ.
def max_subarray(arr): n = len(arr) max_sum = float('-inf') current_sum = 0 for i in range(n): current_sum += arr[i] max_sum = max(max_sum, current_sum) current_sum = max(current_sum, 0) return max_sum
6. Π Π°Π·ΠΌΠ΅Π½ ΠΌΠΎΠ½Π΅Ρ
ΠΡΠΎΠ±Π»Π΅ΠΌΠ° ΡΠ°Π·ΠΌΠ΅Π½Π° ΠΌΠΎΠ½Π΅Ρ Π²ΠΊΠ»ΡΡΠ°Π΅Ρ Π² ΡΠ΅Π±Ρ ΠΏΠΎΠΈΡΠΊ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² Π²Π½Π΅ΡΡΠΈ ΡΠ΄Π°ΡΡ Π½Π° Π·Π°Π΄Π°Π½Π½ΡΡ ΡΡΠΌΠΌΡ Π΄Π΅Π½Π΅Π³, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π·Π°Π΄Π°Π½Π½ΡΠΉ Π½Π°Π±ΠΎΡ Π½ΠΎΠΌΠΈΠ½Π°Π»ΠΎΠ² ΠΌΠΎΠ½Π΅Ρ.
def coin_change(coins, amount): dp = [float('inf')] * (amount+1) dp[0] = 0 for i in range(1, amount+1): for coin in coins: if coin <= i: dp[i] = min(dp[i], dp[i-coin] + 1) return dp[amount] if dp[amount] != float('inf') else -1
7. Π£ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠ΅ΠΏΠΎΡΠΊΠΈ ΠΌΠ°ΡΡΠΈΡ
ΠΠ°Π΄Π°ΡΠ° ΡΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΡ ΡΠ΅ΠΏΠΎΡΠ΅ΠΊ ΠΌΠ°ΡΡΠΈΡ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΠΏΠΎΠΈΡΠΊΠ΅ ΠΎΠΏΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠΏΠΎΡΠΎΠ±Π° ΡΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΡ ΡΡΠ΄Π° ΠΌΠ°ΡΡΠΈΡ. ΠΡΠΎ ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΏΡΠΈΠΌΠ΅Ρ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ ΠΎΠ±Π»Π°ΡΡΡΡ , ΡΠ°ΠΊΠΈΡ ΠΊΠ°ΠΊ ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ½Π°Ρ Π³ΡΠ°ΡΠΈΠΊΠ°, ΡΠΈΡΠ»Π΅Π½Π½ΡΠΉ Π°Π½Π°Π»ΠΈΠ· ΠΈ Π½Π°ΡΡΠ½ΡΠ΅ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ.
def matrix_chain_order(p): n = len(p) - 1 m = [[float('inf')] * n for _ in range(n)] s = [[0] * n for _ in range(n)] for i in range(n): m[i][i] = 0 for l in range(2, n+1): for i in range(n-l+1): j = i + l - 1 for k in range(i, j): q = m[i][k] + m[k+1][j] + p[i] * p[k+1] * p[j+1] if q < m[i][j]: m[i][j] = q s[i][j] = k return m, s
8. Π‘Π°ΠΌΠ°Ρ Π΄Π»ΠΈΠ½Π½Π°Ρ Π²ΠΎΠ·ΡΠ°ΡΡΠ°ΡΡΠ°Ρ ΠΏΠΎΠ΄ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ
ΠΡΠΎΠ±Π»Π΅ΠΌΠ° ΡΠ°ΠΌΠΎΠΉ Π΄Π»ΠΈΠ½Π½ΠΎΠΉ ΡΠ°ΡΡΡΡΠ΅ΠΉ ΠΏΠΎΠ΄ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ (LIS) Π²ΠΊΠ»ΡΡΠ°Π΅Ρ Π² ΡΠ΅Π±Ρ ΠΏΠΎΠΈΡΠΊ ΡΠ°ΠΌΠΎΠΉ Π΄Π»ΠΈΠ½Π½ΠΎΠΉ ΠΏΠΎΠ΄ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΡΡΠΎΠ³ΠΎ Π²ΠΎΠ·ΡΠ°ΡΡΠ°Π΅Ρ. ΠΡΠΎΠ±Π»Π΅ΠΌΠ° LIS ΠΈΠΌΠ΅Π΅Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΡΠ΅Π°Π»ΡΠ½ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΡΠ°ΠΊΠΈΡ ΠΊΠ°ΠΊ ΡΠΆΠ°ΡΠΈΠ΅ Π΄Π°Π½Π½ΡΡ , ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π²Π°Π½ΠΈΠ΅ ΠΎΠ±ΡΠ°Π·ΠΎΠ² ΠΈ Π±ΠΈΠΎΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΊΠ°.
def lis(arr): n = len(arr) dp = [1] * n for i in range(1, n): for j in range(i): if arr[i] > arr[j]: dp[i] = max(dp[i], dp[j] + 1) return max(dp)
9. ΠΠ°Π΄Π°ΡΠ° ΠΊΠΎΠΌΠΌΠΈΠ²ΠΎΡΠΆΠ΅ΡΠ°
ΠΠ°Π΄Π°ΡΠ° ΠΊΠΎΠΌΠΌΠΈΠ²ΠΎΡΠΆΠ΅ΡΠ° (TSP) Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΠΏΠΎΠΈΡΠΊΠ΅ ΠΊΡΠ°ΡΡΠ°ΠΉΡΠ΅Π³ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ³ΠΎ ΠΌΠ°ΡΡΡΡΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠΎΡ ΠΎΠ΄ΠΈΡ ΡΠ΅ΡΠ΅Π· Π·Π°Π΄Π°Π½Π½ΡΠΉ Π½Π°Π±ΠΎΡ Π³ΠΎΡΠΎΠ΄ΠΎΠ² ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ Π² Π½Π°ΡΠ°Π»ΡΠ½ΡΠΉ Π³ΠΎΡΠΎΠ΄. TSP β ΡΡΠΎ ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠ°Ρ Π·Π°Π΄Π°ΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΊΠΈ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΈΠΌΠ΅Π΅Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΡΠ΅Π°Π»ΡΠ½ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΡΠ°ΠΊΠΈΡ ΠΊΠ°ΠΊ Π»ΠΎΠ³ΠΈΡΡΠΈΠΊΠ°, ΡΡΠ°Π½ΡΠΏΠΎΡΡ ΠΈ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΡΠ΅ΡΠΈ.
def tsp(graph, start): n = len(graph) visited = (1 << n) - 1 memo = {} def dfs(node, visited): if visited == 0: return graph[node][start] if (node, visited) in memo: return memo[(node, visited)] ans = float('inf') for i in range(n): if visited & (1 << i): ans = min(ans, graph[node][i] + dfs(i, visited ^ (1 << i))) memo[(node, visited)] = ans return ans return dfs(start, visited)
10. 0-1 Π¦Π΅Π»ΠΎΡΠΈΡΠ»Π΅Π½Π½ΠΎΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅
ΠΠ°Π΄Π°ΡΠ° ΡΠ΅Π»ΠΎΡΠΈΡΠ»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ 0-1 Π²ΠΊΠ»ΡΡΠ°Π΅Ρ Π² ΡΠ΅Π±Ρ ΠΏΠΎΠΈΡΠΊ ΠΎΠΏΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π΄Π»Ρ Π½Π°Π±ΠΎΡΠ° Π΄Π²ΠΎΠΈΡΠ½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΡΠ΅ΡΠ΅Π½ΠΈΡ Ρ ΡΡΠ΅ΡΠΎΠΌ Π½Π°Π±ΠΎΡΠ° ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ. ΠΠ°Π΄Π°ΡΠ° ΡΠ΅Π»ΠΎΡΠΈΡΠ»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ 0-1 ΠΈΠΌΠ΅Π΅Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΡ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, ΡΠ°ΠΊΠΈΡ ΠΊΠ°ΠΊ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΠ΅ΡΡΡΡΠΎΠ², ΡΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠ°ΡΠΏΠΈΡΠ°Π½ΠΈΡ ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π΅Π½Π½ΠΎΠ΅ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅.
def knapsack(W, wt, val, n): dp = [[0] * (W+1) for _ in range(n+1)] for i in range(1, n+1): for w in range(1, W+1): if wt[i-1] <= w: dp[i][w] = max(val[i-1] + dp[i-1][w-wt[i-1]], dp[i-1][w]) else: dp[i][w] = dp[i-1][w] return dp[n][W]
11. Π Π°ΡΡΡΠΎΡΠ½ΠΈΠ΅ ΠΠ΅Π²Π΅Π½ΡΡΠ΅ΠΉΠ½Π° Ρ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½Π½ΡΠΌΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡΠΌΠΈ
ΠΠ°Π΄Π°ΡΠ° Β«Π Π°ΡΡΡΠΎΡΠ½ΠΈΠ΅ ΠΠ΅Π²Π΅Π½ΡΡΠ΅ΠΉΠ½Π°Β» ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ°ΡΡΠΈΡΠ΅Π½Π°, ΡΡΠΎΠ±Ρ ΡΠ°Π·ΡΠ΅ΡΠΈΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΉ Π½Π°Π±ΠΎΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΡΠ°ΠΊΠΈΡ ΠΊΠ°ΠΊ Π²ΡΡΠ°Π²ΠΊΠ°, ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΈ Π·Π°ΠΌΠ΅Π½Π°.
def edit_distance_with_allowed_ops(s1, s2, allowed_ops): m, n = len(s1), len(s2) dp = [[0] * (n+1) for _ in range(m+1)] for i in range(m+1): dp[i][0] = i for j in range(n+1): dp[0][j] = j for i in range(1, m+1): for j in range(1, n+1): if s1[i-1] == s2[j-1]: dp[i][j] = dp[i-1][j-1] elif allowed_ops.get((s1[i-1], s2[j-1])): op_cost = allowed_ops[(s1[i-1], s2[j-1])] dp[i][j] = min(dp[i-1][j] + op_cost[0], dp[i][j-1] + op_cost[1], dp[i-1][j-1] + op_cost[2]) else: dp[i][j] = 1 + min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) return dp[m][n]
12. Π‘Π°ΠΌΠ°Ρ Π΄Π»ΠΈΠ½Π½Π°Ρ ΠΏΠ°Π»ΠΈΠ½Π΄ΡΠΎΠΌΠ½Π°Ρ ΠΏΠΎΠ΄ΡΡΡΠΎΠΊΠ°
ΠΠ°Π΄Π°ΡΠ° Β«Π‘Π°ΠΌΠ°Ρ Π΄Π»ΠΈΠ½Π½Π°Ρ ΠΏΠ°Π»ΠΈΠ½Π΄ΡΠΎΠΌΠ½Π°Ρ ΠΏΠΎΠ΄ΡΡΡΠΎΠΊΠ°Β» Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΠΏΠΎΠΈΡΠΊΠ΅ ΡΠ°ΠΌΠΎΠΉ Π΄Π»ΠΈΠ½Π½ΠΎΠΉ ΠΏΠΎΠ΄ΡΡΡΠΎΠΊΠΈ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΠ°Π»ΠΈΠ½Π΄ΡΠΎΠΌΠΎΠΌ.
def longest_palindromic_substring(s): n = len(s) dp = [[False] * n for _ in range(n)] max_len = 1 start = 0 for i in range(n): dp[i][i] = True for l in range(2, n+1): for i in range(n-l+1): j = i + l - 1 if l == 2: dp[i][j] = s[i] == s[j] else: dp[i][j] = s[i] == s[j] and dp[i+1][j-1] if dp[i][j] and l > max_len: max_len = l start = i return s[start:start+max_len]
13. ΠΠ°Π΄Π°ΡΠ° ΠΎ ΠΏΠΎΠ΄ΠΌΠ°ΡΡΠΈΠ²Π΅ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΡ (Maximum Product Subarray)
ΠΠ°Π΄Π°ΡΠ° ΠΎ ΠΏΠΎΠ΄ΠΌΠ°ΡΡΠΈΠ²Π΅ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΡ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΠΏΠΎΠΈΡΠΊΠ΅ Π½Π΅ΠΏΡΠ΅ΡΡΠ²Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΌΠ°ΡΡΠΈΠ²Π° Π² ΠΎΠ΄Π½ΠΎΠΌΠ΅ΡΠ½ΠΎΠΌ ΠΌΠ°ΡΡΠΈΠ²Π΅ ΡΠΈΡΠ΅Π» Ρ Π½Π°ΠΈΠ±ΠΎΠ»ΡΡΠΈΠΌ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ.
def max_product_subarray(nums): n = len(nums) max_prod = nums[0] min_prod = nums[0] max_so_far = nums[0] for i in range(1, n): temp = max_prod max_prod = max(nums[i], max(nums[i] * max_prod, nums[i] * min_prod)) min_prod = min(nums[i], min(nums[i] * temp, nums[i] * min_prod)) max_so_far = max(max_so_far, max_prod) return max_so_far
14. Π‘Π°ΠΌΡΠΉ Π±ΠΎΠ»ΡΡΠΎΠΉ ΠΏΡΡΠΌΠΎΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊ Π½Π° Π³ΠΈΡΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅
ΠΠ°Π΄Π°ΡΠ° Β«Π‘Π°ΠΌΡΠΉ Π±ΠΎΠ»ΡΡΠΎΠΉ ΠΏΡΡΠΌΠΎΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊ Π² Π³ΠΈΡΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅Β» Π²ΠΊΠ»ΡΡΠ°Π΅Ρ Π² ΡΠ΅Π±Ρ ΠΏΠΎΠΈΡΠΊ ΡΠ°ΠΌΠΎΠ³ΠΎ Π±ΠΎΠ»ΡΡΠΎΠ³ΠΎ ΠΏΡΡΠΌΠΎΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ Π½Π° Π³ΠΈΡΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅, ΡΠΎΡΡΠΎΡΡΠ΅ΠΉ ΠΈΠ· ΠΏΡΡΠΌΠΎΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠΎΠ² ΡΠ°Π·Π½ΠΎΠΉ Π²ΡΡΠΎΡΡ.
def largest_rectangle_area(heights): n = len(heights) left = [0] * n right = [0] * n stack = [] for i in range(n): while stack and heights[stack[-1]] >= heights[i]: stack.pop() left[i] = stack[-1] if stack else -1 stack.append(i) stack = [] for i in range(n-1, -1, -1): while stack and heights[stack[-1]] >= heights[i]: stack.pop() right[i] = stack[-1] if stack else n stack.append(i) max_area = 0 for i in range(n): max_area = max(max_area, heights[i] * (right[i] - left[i] - 1)) return max_area
15. ΠΡΠΎΡΠ°Π½ΠΈΠ΅ ΡΠΈΡ
ΠΠ°Π΄Π°ΡΠ° ΠΎ Π±ΡΠΎΡΠ°Π½ΠΈΠΈ ΡΠΈΡ ΡΠΎΡΡΠΎΠΈΡ Π² ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ Π½Π°ΠΉΡΠΈ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΠΎΠΏΡΡΠΎΠΊ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΡ Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΠ°ΠΌΠΎΠ³ΠΎ Π²ΡΡΠΎΠΊΠΎΠ³ΠΎ ΡΡΠ°ΠΆΠ°, Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠΉΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ±ΡΠΎΡΠ΅Π½ΠΎ, Π½Π΅ ΡΠ°Π·Π±ΠΈΠ²Π°ΡΡΡ.
def egg_drop(n, k): dp = [[0] * (k+1) for _ in range(n+1)] for i in range(1, n+1): dp[i][1] = 1 dp[i][0] = 0 for j in range(1, k+1): dp[1][j] = j for i in range(2, n+1): for j in range(2, k+1): dp[i][j] = float('inf') for x in range(1, j+1): res = 1 + max(dp[i-1][x-1], dp[i][j-x]) dp[i][j] = min(dp[i][j], res) return dp[n][k]
16. ΠΠΎΠ΄ΡΡΠ΅Ρ Π±ΠΈΡΠΎΠ²
ΠΠ°Π΄Π°ΡΠ° ΠΏΠΎΠ΄ΡΡΠ΅ΡΠ° Π±ΠΈΡΠΎΠ² Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ Π½Π°ΠΉΡΠΈ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π΅Π΄ΠΈΠ½ΠΈΡΠ½ΡΡ Π±ΠΈΡΠΎΠ² Π² Π΄Π²ΠΎΠΈΡΠ½ΠΎΠΌ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΈΡΠ»Π° ΠΎΡ 0 Π΄ΠΎ n.
def count_bits(n): dp = [0] * (n+1) for i in range(1, n+1): dp[i] = dp[i >> 1] + (i & 1) return dp
17. ΠΠ΄Π΅Π°Π»ΡΠ½ΡΠ΅ ΠΊΠ²Π°Π΄ΡΠ°ΡΡ
ΠΠ°Π΄Π°ΡΠ° ΠΎ ΡΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΡΡ ΠΊΠ²Π°Π΄ΡΠ°ΡΠ°Ρ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ Π½Π°ΠΉΡΠΈ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΡΡ ΠΊΠ²Π°Π΄ΡΠ°ΡΠ½ΡΡ ΡΠΈΡΠ΅Π», ΠΊΠΎΡΠΎΡΡΠ΅ Π² ΡΡΠΌΠΌΠ΅ Π΄Π°ΡΡ Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ.
def num_squares(n): dp = [float('inf')] * (n+1) dp[0] = 0 for i in range(1, n+1): j = 1 while j*j <= i: dp[i] = min(dp[i], dp[i-j*j] + 1) j += 1 return dp[n]
18. Π Π°Π·Π΄Π΅Π» ΡΠ°Π²Π½ΠΎΠΉ ΡΡΠΌΠΌΡ ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° (Partition Equal Subset Sum)
ΠΡΠΎΠ±Π»Π΅ΠΌΠ° ΡΠ°Π²Π½ΠΎΠΉ ΡΡΠΌΠΌΡ ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ² ΡΠ°Π·Π΄Π΅Π»ΠΎΠ² Π²ΠΊΠ»ΡΡΠ°Π΅Ρ Π² ΡΠ΅Π±Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΠΎΠ³ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ ΡΠ°Π·Π±ΠΈΡΡ Π΄Π°Π½Π½ΡΠΉ Π½Π°Π±ΠΎΡ Π½Π° Π΄Π²Π° ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ ΡΡΠΌΠΌΠ° ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π² ΠΎΠ±ΠΎΠΈΡ ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π°Ρ Π±ΡΠ»Π° ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠΉ.
def can_partition(nums): n = len(nums) s = sum(nums) if s % 2 != 0: return False target = s // 2 dp = [False] * (target+1) dp[0] = True for i in range(1, n+1): for j in range(target, nums[i-1]-1, -1): dp[j] |= dp[j-nums[i-1]] return dp[target]
19. Π‘Π°ΠΌΠ°Ρ Π΄Π»ΠΈΠ½Π½Π°Ρ ΠΎΠ±ΡΠ°Ρ ΠΏΠΎΠ΄ΡΡΡΠΎΠΊΠ°
ΠΠ°Π΄Π°ΡΠ° Β«Π‘Π°ΠΌΠ°Ρ Π΄Π»ΠΈΠ½Π½Π°Ρ ΠΎΠ±ΡΠ°Ρ ΠΏΠΎΠ΄ΡΡΡΠΎΠΊΠ°Β» Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΠΏΠΎΠΈΡΠΊΠ΅ ΡΠ°ΠΌΠΎΠΉ Π΄Π»ΠΈΠ½Π½ΠΎΠΉ ΠΏΠΎΠ΄ΡΡΡΠΎΠΊΠΈ, ΠΎΠ±ΡΠ΅ΠΉ Π΄Π»Ρ Π΄Π²ΡΡ Π·Π°Π΄Π°Π½Π½ΡΡ ΡΡΡΠΎΠΊ.
def longest_common_substring(s1, s2): m, n = len(s1), len(s2) dp = [[0] * (n+1) for _ in range(m+1)] max_len = 0 for i in range(1, m+1): for j in range(1, n+1): if s1[i-1] == s2[j-1]: dp[i][j] = dp[i-1][j-1] + 1 max_len = max(max_len, dp[i][j]) return max_len
22. Π£Π½ΠΈΠΊΠ°Π»ΡΠ½ΡΠ΅ ΠΏΡΡΠΈ
ΠΡΠΎΠ±Π»Π΅ΠΌΠ° ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΡ
ΠΏΡΡΠ΅ΠΉ Π²ΠΊΠ»ΡΡΠ°Π΅Ρ Π² ΡΠ΅Π±Ρ ΠΏΠΎΠΈΡΠΊ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΡ
ΠΏΡΡΠ΅ΠΉ ΠΈΠ· Π²Π΅ΡΡ
Π½Π΅Π³ΠΎ Π»Π΅Π²ΠΎΠ³ΠΎ ΡΠ³Π»Π° Π² Π½ΠΈΠΆΠ½ΠΈΠΉ ΠΏΡΠ°Π²ΡΠΉ ΡΠ³ΠΎΠ» ΡΠ΅ΡΠΊΠΈ m x n
, ΠΏΠΎ ΠΊΠΎΡΠΎΡΡΠΌ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π²ΠΈΠ³Π°ΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π²Π½ΠΈΠ· ΠΈΠ»ΠΈ Π²ΠΏΡΠ°Π²ΠΎ.
def unique_paths(m, n): dp = [[0] * n for _ in range(m)] dp[0][0] = 1 for i in range(m): for j in range(n): if i > 0: dp[i][j] += dp[i-1][j] if j > 0: dp[i][j] += dp[i][j-1] return dp[m-1][n-1]
23. Π Π°ΡΡΡΠΎΡΠ½ΠΈΠ΅ ΠΠ΅Π²Π΅Π½ΡΡΠ΅ΠΉΠ½Π° Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½Π½ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ
ΠΠ°Π΄Π°ΡΡ Β«Π Π°ΡΡΡΠΎΡΠ½ΠΈΠ΅ ΠΠ΅Π²Π΅Π½ΡΡΠ΅ΠΉΠ½Π°Β» ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°ΡΡΠΈΡΠΈΡΡ, Π΅ΡΠ»ΠΈ ΠΌΡ Ρ ΠΎΡΠΈΠΌ ΡΠ°Π·ΡΠ΅ΡΠΈΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΉ Π½Π°Π±ΠΎΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΡΠ°ΠΊΠΈΡ ΠΊΠ°ΠΊ Π²ΡΡΠ°Π²ΠΊΠ°, ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΈ Π·Π°ΠΌΠ΅Π½Π°.
def edit_distance_with_allowed_ops(s1, s2, allowed_ops): m, n = len(s1), len(s2) dp = [[0] * (n+1) for _ in range(m+1)] for i in range(m+1): dp[i][0] = i for j in range(n+1): dp[0][j] = j for i in range(1, m+1): for j in range(1, n+1): if s1[i-1] == s2[j-1]: dp[i][j] = dp[i-1][j-1] elif allowed_ops.get((s1[i-1], s2[j-1])): op_cost = allowed_ops[(s1[i-1], s2[j-1])] dp[i][j] = min(dp[i-1][j] + op_cost[0], dp[i][j-1] + op_cost[1], dp[i-1][j-1] + op_cost[2]) else: dp[i][j] = 1 + min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) return dp[m][n]
24. ΠΡΠΎΠ±Π»Π΅ΠΌΠ° ΡΡΠΌΠΌΡ ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π°
ΠΡΠΎΠ±Π»Π΅ΠΌΠ° ΡΡΠΌΠΌΡ ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° Π²ΠΊΠ»ΡΡΠ°Π΅Ρ Π² ΡΠ΅Π±Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΠΎΠ³ΠΎ, ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π»ΠΈ ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡΠ° ΡΠ΅Π»ΡΡ ΡΠΈΡΠ΅Π», ΠΊΠΎΡΠΎΡΠΎΠ΅ Π² ΡΡΠΌΠΌΠ΅ Π΄Π°Π΅Ρ Π·Π°Π΄Π°Π½Π½ΡΡ ΡΡΠΌΠΌΡ.
def subset_sum(nums, target): n = len(nums) dp = [[False] * (target+1) for _ in range(n+1)] for i in range(n+1): dp[i][0] = True for i in range(1, n+1): for j in range(1, target+1): if nums[i-1] <= j: dp[i][j] = dp[i-1][j-nums[i-1]] or dp[i-1][j] else: dp[i][j] = dp[i-1][j] return dp[n][target]
25. Π‘Π°ΠΌΠ°Ρ Π΄Π»ΠΈΠ½Π½Π°Ρ ΠΏΠ°Π»ΠΈΠ½Π΄ΡΠΎΠΌΠ½Π°Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ
ΠΠ°Π΄Π°ΡΠ° Β«Π‘Π°ΠΌΠ°Ρ Π΄Π»ΠΈΠ½Π½Π°Ρ ΠΏΠ°Π»ΠΈΠ½Π΄ΡΠΎΠΌΠ½Π°Ρ ΠΏΠΎΠ΄ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡΒ» Π²ΠΊΠ»ΡΡΠ°Π΅Ρ Π² ΡΠ΅Π±Ρ ΠΏΠΎΠΈΡΠΊ ΡΠ°ΠΌΠΎΠΉ Π΄Π»ΠΈΠ½Π½ΠΎΠΉ ΠΏΠΎΠ΄ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΠ°Π»ΠΈΠ½Π΄ΡΠΎΠΌΠΎΠΌ.
def longest_palindromic_substring(s): n = len(s) dp = [[False] * n for _ in range(n)] max_len = 1 start = 0 for i in range(n): dp[i][i] = True for l in range(2, n+1): for i in range(n-l+1): j = i + l - 1 if l == 2: dp[i][j] = s[i] == s[j] else: dp[i][j] = s[i] == s[j] and dp[i+1][j-1] if dp[i][j] and l > max_len: max_len = l start = i return s[start:start+max_len]
25. Π‘Π°ΠΌΡΠΉ Π±ΠΎΠ»ΡΡΠΎΠΉ ΠΏΡΡΠΌΠΎΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊ Π½Π° Π³ΠΈΡΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅
ΠΠ°Π΄Π°ΡΠ° Β«Π‘Π°ΠΌΡΠΉ Π±ΠΎΠ»ΡΡΠΎΠΉ ΠΏΡΡΠΌΠΎΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊ Π² Π³ΠΈΡΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅Β» Π²ΠΊΠ»ΡΡΠ°Π΅Ρ Π² ΡΠ΅Π±Ρ ΠΏΠΎΠΈΡΠΊ ΡΠ°ΠΌΠΎΠ³ΠΎ Π±ΠΎΠ»ΡΡΠΎΠ³ΠΎ ΠΏΡΡΠΌΠΎΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ Π½Π° Π³ΠΈΡΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅, ΡΠΎΡΡΠΎΡΡΠ΅ΠΉ ΠΈΠ· ΠΏΡΡΠΌΠΎΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠΎΠ² ΡΠ°Π·Π½ΠΎΠΉ Π²ΡΡΠΎΡΡ.
def largest_rectangle_area(heights): n = len(heights) left = [0] * n right = [0] * n stack = [] for i in range(n): while stack and heights[stack[-1]] >= heights[i]: stack.pop() left[i] = stack[-1] if stack else -1 stack.append(i) stack = [] for i in range(n-1, -1, -1): while stack and heights[stack[-1]] >= heights[i]: stack.pop() right[i] = stack[-1] if stack else n stack.append(i) max_area = 0 for i in range(n): max_area = max(max_area, heights[i] * (right[i] - left[i] - 1)) return max_area
Π£Π½ΠΈΠΊΠ°Π»ΡΠ½ΡΠ΅ ΠΏΡΡΠΈ 2
ΠΠ°Π΄Π°ΡΠ° Β«Π£Π½ΠΈΠΊΠ°Π»ΡΠ½ΡΠ΅ ΠΏΡΡΠΈ IIΒ» β ΡΡΠΎ ΡΠ°Π·Π½ΠΎΠ²ΠΈΠ΄Π½ΠΎΡΡΡ Π·Π°Π΄Π°ΡΠΈ Β«Π£Π½ΠΈΠΊΠ°Π»ΡΠ½ΡΠ΅ ΠΏΡΡΠΈΒ», Π² ΠΊΠΎΡΠΎΡΠΎΠΉ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΡΡΠ΅ΠΉΠΊΠΈ Π² ΡΠ΅ΡΠΊΠ΅ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Ρ ΠΈ ΠΏΠΎ Π½ΠΈΠΌ Π½Π΅Π»ΡΠ·Ρ ΠΏΡΠΎΠΉΡΠΈ. ΠΠ°Π΄Π°ΡΠ° ΡΠΎΡΡΠΎΠΈΡ Π² ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ Π½Π°ΠΉΡΠΈ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΡ ΠΏΡΡΠ΅ΠΉ ΠΈΠ· Π²Π΅ΡΡ Π½Π΅Π³ΠΎ Π»Π΅Π²ΠΎΠ³ΠΎ ΡΠ³Π»Π° Π² Π½ΠΈΠΆΠ½ΠΈΠΉ ΠΏΡΠ°Π²ΡΠΉ ΡΠ³ΠΎΠ» ΡΠ΅ΡΠΊΠΈ, Π³Π΄Π΅ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π²ΠΈΠ³Π°ΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π²Π½ΠΈΠ· ΠΈΠ»ΠΈ Π²ΠΏΡΠ°Π²ΠΎ ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Ρ ΠΎΠ΄ΠΈΡΡ ΠΏΠΎ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌ ΡΡΠ΅ΠΉΠΊΠ°ΠΌ.
def unique_paths_with_obstacles(obstacle_grid): m, n = len(obstacle_grid), len(obstacle_grid[0]) dp = [[0] * n for _ in range(m)] if obstacle_grid[0][0] == 0: dp[0][0] = 1 for i in range(m): for j in range(n): if obstacle_grid[i][j] == 0: if i > 0: dp[i][j] += dp[i-1][j] if j > 0: dp[i][j] += dp[i][j-1] return dp[m-1][n-1]
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
ΠΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ β ΡΡΠΎ ΠΌΠΎΡΠ½ΡΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠΉ Π΄Π»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° ΡΠ»ΠΎΠΆΠ½ΡΡ Π·Π°Π΄Π°Ρ ΡΠΏΠΎΡΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ. ΠΠ»Π³ΠΎΡΠΈΡΠΌΡ, ΠΎΠ±ΡΡΠΆΠ΄Π°Π΅ΠΌΡΠ΅ Π² ΡΡΠΎΠΌ Π±Π»ΠΎΠ³Π΅, β Π»ΠΈΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠ· ΠΌΠ½ΠΎΠ³ΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΅ΡΠΈΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ. ΠΡΠ²ΠΎΠΈΠ² ΡΡΠΈ Π°Π»Π³ΠΎΡΠΈΡΠΌΡ ΠΈ ΠΏΠΎΠ½ΡΠ² Π»Π΅ΠΆΠ°ΡΠΈΠ΅ Π² ΠΈΡ ΠΎΡΠ½ΠΎΠ²Π΅ ΠΏΡΠΈΠ½ΡΠΈΠΏΡ, Π²Ρ ΡΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΡΠ°ΡΡ Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΠ½ΠΊΡΡΠ΅Π½ΡΠΎΡΠΏΠΎΡΠΎΠ±Π½ΡΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠΎΠΌ ΠΈ ΡΠ΅ΡΠ°ΡΡ Π±ΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΡΠ΅ Π·Π°Π΄Π°ΡΠΈ.
ΠΠ°ΡΠ΅ΡΠΈΠ°Π»Ρ ΠΏΠΎ ΡΠ΅ΠΌΠ΅
- π𧩠ΠΠ°Π΄Π°ΡΠ° ΠΎ ΠΏΠΎΠ²ΡΠ΅ΠΆΠ΄Π΅Π½Π½ΠΎΠΉ XML-ΡΡΡΠΎΠΊΠ΅
- π𧩠ΠΠ°Π΄Π°ΡΠ° ΠΎΠ± ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Π»Π°ΡΠΈΠ½ΡΠΊΠΎΠ³ΠΎ ΠΊΠ²Π°Π΄ΡΠ°ΡΠ°