Skip to content

Commit d661fd2

Browse files
author
yangxingchen
committed
update: add some dp.
1 parent 5b72e5e commit d661fd2

File tree

3 files changed

+81
-30
lines changed

3 files changed

+81
-30
lines changed
Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
'''
2+
Author: yangxingchen
3+
Date: 2020-04-14 11:08:53
4+
LastEditors: yangxingchen
5+
LastEditTime: 2021-01-21 12:07:56
6+
Description:
7+
'''
18
"""
29
找零钱问题
310
要求,使用的硬币最少找领
@@ -14,35 +21,50 @@ def change_greedy(coin_list, money):
1421
return result
1522

1623
def change_recursion(coin_list, money):
24+
"""
25+
递归解法
26+
Args:
27+
coin_list (list): 找零的单元列表
28+
money (int): 需要找多少钱
29+
Returns:
30+
int: 返回次数
31+
"""
1732
if money == 0:
1833
return 0
1934
best = -1
2035
for coin in coin_list:
21-
if (coin <= money):
22-
next_try = change_recursion(coin_list, money - coin)
23-
if best < 0 or best > next_try + 1:
24-
best = next_try + 1
36+
if (coin > money): # 硬币面值比需要找零的大,因此找不了
37+
continue
38+
next_try = change_recursion(coin_list, money - coin)
39+
if best < 0 or best > next_try + 1: # best初始化会为-1
40+
best = next_try + 1
2541
return best
2642

2743
def coinChange(coins, amount) -> int:
2844
MAX_INT = 999999999
45+
# 第一步,构建状态数组
2946
f = [0] * (amount + 1)
3047
f[0] = 0
31-
48+
# 划分子问题,子问题,为,需要使用多少枚硬币拼出27-a_k枚硬币
3249
for i in range(1, amount + 1):
50+
# 计算拼出1、2...amount块钱最少的情况。
51+
# 这种方式是从底层到上层 一层层的构建
3352
f[i] = MAX_INT
3453
# last coin A[j]
3554
# f[i] = min {f[i-A[0] + 1], f[i - A[n - 1] + 1 ...]}
3655
for j in coins:
37-
if i >= j and f[i - j] != MAX_INT:
56+
if j > i: # coins 的值大于要找零的,这次循环将无效
57+
continue
58+
if f[i - j] != MAX_INT: # 这里其实就是转移方程使用了。
3859
f[i] = min(f[i - j] + 1, f[i])
39-
60+
# 转移方程如下
61+
print(f)
4062
return f[amount] if f[amount] != MAX_INT else -1
4163

4264
if __name__ == "__main__":
43-
coin_list = [1, 4, 6, 10]
44-
n = 12
65+
coin_list = [2, 5, 7]
66+
n = 3
4567
# print(change_greedy(coin_list, n))
4668
# print(change_recursion(coin_list, n))
4769
# 贪心算法已经达不到正确的解答了
48-
print(coinChange([1, 2, 5], 11))
70+
print("最少使用%d枚硬币拼出%d块钱" % (coinChange(coin_list, n), n))

DynamicProgramming/LongestCommonSubsequence/LCS.py

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,27 @@
1+
'''
2+
Author: yangxingchen
3+
Date: 2020-04-15 13:44:20
4+
LastEditors: yangxingchen
5+
LastEditTime: 2021-01-21 15:12:22
6+
Description:
7+
'''
18
def longestCommonSubsequence(text1, text2) -> int:
29
m = len(text1)
310
n = len(text2)
411

512
if m == 0 or n == 0:
613
return 0
7-
8-
dp1 = [[0] * (n + 1)] * (m + 1) # m 行 n 列的数组
14+
# 构建m行n列的数组
15+
# dp1 = [[0] * (n + 1)] * (m + 1) # m 行 n 列的数组
916

1017
dp = [[0]*(len(text2)+1) for _ in range(len(text1)+1)]
11-
for i in dp1:
12-
print("====")
13-
print(i)
14-
print("+++++++++++")
15-
for i in dp:
16-
print("====")
17-
print(i)
18-
# for i in range(m):
19-
for i in range(len(text1)):
2018

21-
# for j in range(n):
22-
# if text2[j] != text1[i]:
23-
# dp[i + 1][ j + 1] = max(dp[i][j + 1], dp[i + 1][j])
24-
# else:
25-
# dp[i+1][j+1] = dp[i][j] + 1
19+
for i in range(len(text1)):
2620
for j in range(len(text2)):
2721
if text1[i] != text2[j]:
2822
dp[i+1][j+1] = max(dp[i+1][j], dp[i][j+1])
2923
else:
3024
dp[i+1][j+1] = dp[i][j] + 1
31-
# for i in range(m):
32-
# print("====")
33-
# print(i)
34-
# print(f[i])
3525

3626
# dp = [[0]*(len(text2)+1) for _ in range(len(text1)+1)]
3727
# for i in range(len(text1)):
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
'''
2+
Author: yangxingchen
3+
Date: 2021-01-21 16:06:16
4+
LastEditors: yangxingchen
5+
LastEditTime: 2021-01-21 17:41:55
6+
Description:
7+
'''
8+
"""
9+
题目描述,给定m行n列的网格,有一个机器人从左上角(0,0)出发,每一步可以向下或者向右,
10+
问:有多少种不同的方式走到右下角。
11+
"""
12+
13+
def unique_path(m, n) -> int:
14+
if m <= 0 or n <=0:
15+
return 0
16+
# 理论上,这种题目构造一个一维数组也可以
17+
# 需要分析出转移方程,
18+
# 机器人最后一步要不是往下,要不是往右边
19+
# 令f(x, y) 表示走到x,y的步数,那么f(x+1, y+1) = f(x, y+1) + f(x+1, y)
20+
21+
# 开状态数组
22+
dp = [[0]*(n+1) for _ in range(m+1)]
23+
# 构建初始状态
24+
# dp = 1
25+
for x in dp:
26+
print(x)
27+
for i in range(1, m+1):
28+
for j in range(1, n+1):
29+
if j == 1 or i == 1:
30+
dp[i][j] = 1 # 初始化,把初始化放到了这里
31+
continue
32+
print(i, j, '===')
33+
dp[i][j] = dp[i][j -1] + dp[i-1][j]
34+
for x in dp:
35+
print(x)
36+
print(dp[m][n])
37+
38+
if __name__ == "__main__":
39+
unique_path(3, 4)

0 commit comments

Comments
 (0)