【打卡-蓝桥杯】Day 18

这篇博客介绍了使用动态规划算法解决两个经典问题:最长公共子序列(LCS)和最长滑雪道。在LCS问题中,通过比较字符并填充二维数组来找到两个字符串的最长相同子串。在最长滑雪道问题中,结合深度优先搜索(DFS),避免重复搜索已访问过的点,以找到最长的下降路径。这两个问题都展示了动态规划在优化搜索过程中的应用。
摘要由CSDN通过智能技术生成

题目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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值