当前位置: 首页 > article >正文

头歌算法实验六 动态规划2

1.矩阵连乘问题

def matrix_chain_order(p):
    n = len(p) - 1
    m = [[0] * n for _ in range(n)]
    s = [[0] * n for _ in range(n)]

    for length in range(2, n + 1):
        for i in range(n - length + 1):
            j = i + length - 1
            m[i][j] = float('inf')
            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], s[i][j] = q, k

    return s

def print_optimal_parens(s, i, j):
    return f"A{i + 1}" if i == j else "(" + print_optimal_parens(s, i, s[i][j]) + print_optimal_parens(s, s[i][j] + 1, j) + ")"

if __name__ == "__main__":
    dimensions = [3, 2, 5, 10, 2, 3]  
    s = matrix_chain_order(dimensions)
    result = print_optimal_parens(s, 0, len(dimensions) - 2)
    print('最优括号化方式:', result)

2.最长公共子序列问题

def LCS(X, Y):
    n, m = len(X), len(Y)
    c = [[0] * (m + 1) for _ in range(n + 1)]
    
    # 构建长度矩阵
    for i in range(1, n + 1):
        for j in range(1, m + 1):
            if X[i - 1] == Y[j - 1]:
                c[i][j] = c[i - 1][j - 1] + 1
            else:
                c[i][j] = max(c[i - 1][j], c[i][j - 1])
    
    # 回溯找到LCS
    lcs = []
    while n > 0 and m > 0:
        if X[n - 1] == Y[m - 1]:
            lcs.append(X[n - 1])
            n -= 1
            m -= 1
        elif c[n - 1][m] >= c[n][m - 1]:
            n -= 1
        else:
            m -= 1

    return lcs[::-1]  # 反转以获得正确顺序

if __name__ == "__main__":
    A = ['z', 'x', 'y', 'x', 'y', 'z']
    B = ['x', 'y', 'y', 'z', 'x']
    print(LCS(A, B))  # 输出:['y', 'y', 'z']

3.最长公共子串问题

def longest_common_substring(X, Y):
    m, n = len(X), len(Y)
    longest_length, end_index = 0, 0
    dp = [[0] * (n + 1) for _ in range(m + 1)]

    for i in range(1, m + 1):
        for j in range(1, n + 1):
            if X[i - 1] == Y[j - 1]:
                dp[i][j] = dp[i - 1][j - 1] + 1
                if dp[i][j] > longest_length:
                    longest_length, end_index = dp[i][j], i

    return X[end_index - longest_length:end_index]
X, Y = "ABABC", "BABCA"
print('最长公共子串:', longest_common_substring(X, Y))


http://www.kler.cn/news/341523.html

相关文章:

  • C语言 | Leetcode C语言题解之第454题四数相加II
  • ChatGPT对文本总结
  • 智慧矿山无人机空地一体化解决方案
  • 受限情况下国产系统电脑备份文件夹的办法
  • SpringBoot框架下旅游管理系统的创新设计与实现
  • YoloV5检测配置多模型
  • SpringBoot系列 启动流程
  • fastreport导出PDF后style bold粗体斜体等字体风格不显示的原因
  • LeetCode 54 Spiral Matrix 解题思路和python代码
  • mybatisPlus对于pgSQL中UUID和UUID[]类型的交互
  • 构建高效数据处理桥梁:探索基于数据库驱动的自定义TypeHandler解决方案
  • 基于esp8266的nodemcu实现网页配置wifi功能
  • SpringBoot框架在服装生产管理中的创新应用
  • ANSYS Workbench随机连通孔结构建模
  • 【Cursor教程】探索Cursor颠覆编程体验的创新工具!教程+示例+快捷键
  • Github 2024-10-03Go开源项目日报Top10
  • LeetCode讲解篇之34. 在排序数组中查找元素的第一个和最后一个位置
  • zigbee学习
  • C++-容器适配器- stack、queue、priority_queue和仿函数
  • 重生之我们在ES顶端相遇第 20 章 - Mapping 参数设置大全(进阶)