Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 动态解决方案的成本函数;“最长递增子序列”;问题_Python_Algorithm_Dynamic Programming_Computer Science_Theory - Fatal编程技术网

Python 动态解决方案的成本函数;“最长递增子序列”;问题

Python 动态解决方案的成本函数;“最长递增子序列”;问题,python,algorithm,dynamic-programming,computer-science,theory,Python,Algorithm,Dynamic Programming,Computer Science,Theory,因此,我有一个非常简单的“最长递增子序列”问题的动态规划解决方案(找到给定序列中递增元素的最长子序列,例如[1,7,2,6,4],它将是[1,2,4]),它还可以找到实际的子序列(而不仅仅是长度): sequence=[1,8,6,4,9,8,3,5,2,7,1,9,5,7] listofincreasing=[]表示范围内的uu(len(sequence))] ListofIncreming[0]。追加(序列[0]) 对于范围(1,len(序列))中的右侧: 对于范围内的左侧(右侧): 如果(

因此,我有一个非常简单的“最长递增子序列”问题的动态规划解决方案(找到给定序列中递增元素的最长子序列,例如[1,7,2,6,4],它将是[1,2,4]),它还可以找到实际的子序列(而不仅仅是长度):

sequence=[1,8,6,4,9,8,3,5,2,7,1,9,5,7]
listofincreasing=[]表示范围内的uu(len(sequence))]
ListofIncreming[0]。追加(序列[0])
对于范围(1,len(序列))中的右侧:
对于范围内的左侧(右侧):
如果(sequence[left]
这些脑筋急转弯对我来说是很容易处理的,但我真的不知道背后的硬理论。我的问题是:我将如何创建一个成本函数,正式描述“我是如何填写清单的”,可以这么说吗?有人能告诉我如何处理这个例子中的这些问题吗?提前谢谢


编辑-一些人要求澄清。以最简洁的方式,我需要创建一个数学函数,方法与这里创建的完全相同:在“使用动态方法解决硬币兑换的公式:“部分,但不是针对更改生成问题,而是针对我对最长递增子序列问题的解决方案

您正在动态规划解决方案中寻找重叠子问题的递归公式

LONGEST(S,x)
为序列S的前x个字符的最长递增子序列。然后,问题的解决方案是
LONGEST(S,| S |)

递归(使用基于1的索引):

如果x=1,则最长(S,x)=S[1]。否则,,
最长(S,x)=以下各项中最长的:
S[x],

最长的(S,y),其中1“我是如何填写列表的”:我不知道这意味着什么。@trincot这只是意味着填写“ListofIncreming”列表的方式等同于解决方案的实际运行方式,这就是我试图用成本函数形式化描述的内容。我不知道成本函数与此有何关系。我将把这留给其他人去理解。这个问题很难理解。给出一些明确的例子并加以阐述……啊,问题是你在medium.com的文章中看到了大的“C”,你说的是“成本函数”,但它并不是通常意义上的成本函数。更令人困惑的是,“成本函数”通常会生成一个您希望最小化的数字,而您的函数会生成一个您希望最大化长度的列表。不要说“成本函数”,你应该说“递归公式”或类似的东西。
sequence = [1, 8, 6, 4, 9, 8, 3, 5, 2, 7, 1, 9, 5, 7]
listofincreasing = [[] for _ in range(len(sequence))]
listofincreasing[0].append(sequence[0])

for right in range(1, len(sequence)):
    for left in range(right):
        if (sequence[left] < sequence[right]) and (len(listofincreasing[right]) < len(listofincreasing[left])):
            listofincreasing[right] = [] + listofincreasing[left]
    listofincreasing[right].append(sequence[right])

print(max(listofincreasing, key=len))
LONGEST(S,x) = S[1] if x = 1. Otherwise,
LONGEST(S,x) = the longest of:
    S[x],
    LONGEST(S,y), where 1 <= y < x, or
    LONGEST(S,y) + S[x], where 1 <= y < x and LAST_ELMENT(LONGEST(S,y)) < S[x]