题目1 :算法提高 最长公共子序列
解题思路
动态规划,先从一个开始找,
如果相等,arr[i][j] = arr[i-1][j-1]+1
否则 找 上面和左面 最大的
代码
def lcs(str1, str2):
l1 = len(str1)
l2 = len(str2)
arr = [[0 for _ in range(l1 + 1)] for _ in range(l2 + 1)]
for i in range(1, l1+1):
for j in range(1, l2+1):
if str1[i-1] == str2[j-1]:
arr[i][j] = arr[i-1][j-1] + 1
else:
arr[i][j] = max(arr[i][j-1], arr[i-1][j])
return arr
str1 = input()
str2 = input()
ansList = lcs(str1, str2)
print(ansList[-1][-1])
题目2 :算法提高 最长滑雪道
解题思路
动态规划 + DFS搜索
不管怎么样,只要遇见走过的 点,就可以不用再走一遍了,走过的点 已存在最优解
利用DFS 将找当前点的最优,并且设定递归终止条件为,搜索的点不为0时,代表该点有最优值
代码
def dfs(i, j):
max_height = 1
if dp[i][j] > 0:
return dp[i][j]
for k in range(4):
i1 = i + next_[k][0]
j1 = j + next_[k][1]
if i1 < 0 or i1 >= R or j1 < 0 or j1 >= C:
continue
if arr[i1][j1] >= arr[i][j]:
continue
max_height = max(max_height, dfs(i1, j1) + 1)
return max_height
R, C = map(int, input().split())
ans = 0
arr = [list(map(int, input().split())) for _ in range(R)]
dp = [[0 for _ in range(C)] for _ in range(R)]
next_ = [[0, 1], [1, 0], [0, -1], [-1, 0]] # 行走方向
for i in range(R):
for j in range(C):
ans = max(ans, dfs(i, j))
print(ans)
基础题今天就结束了,接下来刷群里朋友发的
《夺奖宝典》(上).pdf