zoukankan      html  css  js  c++  java
  • 【算法导论-动态规划】整齐打印

    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)
    
  • 相关阅读:
    VIJOS-P1446 最短路上的统计
    洛谷 CF997A Convert to Ones
    USACO Your Ride Is Here
    NOIP 2006 明明的随机数
    NOIP 2008 传球游戏
    数据结构—链表详解
    洛谷 P1160 队列安排
    洛谷 P1167 刷题
    JDOJ 2982: 最大连续子段和问题
    洛谷 P1123 取数游戏
  • 原文地址:https://www.cnblogs.com/aric2016/p/14660717.html
Copyright © 2011-2022 走看看