Codeforces 暑期特訓:我想成為演算法大師 - Week 5
From LI2 Contests Group
Contest 19. Dynamic Programming
C. Turtle and Money
Problem: C. Turtle and Money
Solution: GitHub Code
dp[i][j]表示從(0, 0)走到(i, j)的加總最大值tar = dp[x][y] - arr[x][y]就可以知道上一個數值,可能為dp[x-1][y]或dp[x][y-1]
1 | void solve() { |
E. Knight
Problem: E. Knight
Solution: GitHub Code
dp[i][j]為走到(i, j)的種數
1 | void solve() { |
I. Levenshtein Distance
Problem: I. Levenshtein Distance
Solution: GitHub Code
兩個字串由後往前找
(i, j):- 如果
s1[i]==s2[j]: 則可以視(i+1, j+1)為相同的答案 - 如果不一樣,那麼就找以下三種作法的最小值+1:
- Replace:
(i+1, j+1) - Delete:
(i+1, j) - Insert:
(i, j+1)
- Replace:
- 如果
初始化最後一排及最後一列,此狀態問題為字串
s1/s2與空字串的差,即為字串s1/s2的長度,因此遞減為0可以參考這支影片
1 | void solve() { |
N. Knapsack Problem
Problem: N. Knapsack Problem
Solution: GitHub Code
- 01 背包問題,只是陣列裡存的是最少物品數量,若為
INT_MAX則找不到解法 dp[i][j]表示前i個物品當中,重量剛好為j的最少物品數量
1 | void solve() { |
P. Weights
Problem: P. Weights
Solution: GitHub Code
- 要能將重量平均放在兩邊,則每邊重量各別為總重量的一半
- 若總重量的一半為
m,則可用 01 背包問題求背包最大為m時,是否能裝滿
1 | void solve() { |