【算法导论-动态规划】整齐打印

image
python实现

word = ["optimal", "substructure", "in", "the", "following", "way"]


def Printing_Neatly(l, n, M):
    """
    :param l: 包含每个单词的长度的数组
    :param n: 单词的个数
    :param M:  一行所能容纳的字符个数
    :return:
    """
    Ext = [[0 for i in range(n + 1)] for j in range(n + 1)]
    LCost = [[0 for i in range(n + 1)] for j in range(n + 1)]
    for i in range(1, n + 1):
        Ext[i][i] = M - l[i - 1]
        for j in range(i + 1, n + 1):
            Ext[i][j] = Ext[i][j - 1] - l[j - 1] - 1  # compute extra space
    for i in range(1, n + 1):
        for j in range(i, n + 1):
            if Ext[i][j] < 0:
                LCost[i][j] = sys.maxsize  # this line don’t fit, to set the cost is infinity
            elif Ext[i][j] >= 0 and j == n:
                LCost[i][j] = 0
            else:
                LCost[i][j] = (Ext[i][j]) ^ 3
    C = [0 for i in range(n + 1)]
    # 计算最小代价而且找到最小代价的每行换行处。
    # C[j]意味着从单词1到单词j的最优总代价(代价=立方和)

    # R[]用于打印解决方式
    R = [0 for i in range(n + 1)]
    for j in range(1, n + 1):
        C[j] = sys.maxsize
        for i in range(1, j + 1):
            if C[i - 1] != sys.maxsize and (LCost[i][j] + C[i - 1]) < C[j]:
                C[j] = LCost[i][j] + C[i - 1]
                R[j] = i

    print_lines(R, n)


def print_lines(R, j):
    no = 0
    i = R[j]
    if i == 1:
        no = 1
    else:
        no = print_lines(R, i - 1) + 1
    print("Line number:", no, end=", ")
    for t in range(i, j):
        print("", word[t - 1], end=" ")
    print("")
    return no  # 行号


if __name__ == '__main__':
    n = len(word)
    l = [0 for i in range(n)]
    for i in range(n):
        l[i] = len(word[i])
    Printing_Neatly(l, n, 20)
posted @   Eric小星  阅读(334)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示