标签: dynamic-programming

在python中,如何有效地找到列表中不一定相邻的最大连续数字集?

例如,如果我有一个列表

[1,4,2,3,5,4,5,6,7,8,1,3,4,5,9,10,11]
Run Code Online (Sandbox Code Playgroud)

该算法应返回[1,2,3,4,5,6,7,8,9,10,11].

澄清一下,最长的清单应该向前运行.我想知道什么是算法上有效的方法(最好不是O(n ^ 2))?

此外,我对一个不在python中的解决方案持开放态度,因为算法才是最重要的.

谢谢.

python arrays algorithm numpy dynamic-programming

11
推荐指数
1
解决办法
5427
查看次数

自下而上设置生成和订购

关于您知道哪些可能相关的数值方法的任何方法,请在此处发布!

背景

我有一个values每个集合的数组,每个值的索引对应于值绑定的集合,因此我将集合表示为一个整数,其中元素表示位位置,例如,其中包含元素1的集合是表示为...001其中1LSB.

所以集合只是一个索引并且从不存储,它是动态生成的,它是导致数组中代表集合值的索引的关键.

我所做的是给定一个集合,是任何成对不相交子集的总和值大于该集合的值.例如,如果set 0111的值为3,其中两个子集的值为0100 = 20011 = 2,那么这种拆分更有利.我为集合的所有子集执行此操作.

给定三个代理并且排序是集合数字表示.

val[8] = {0,1,2,4,3,2,4,2} the values is not important, only how they are ordered
          0 0 0 0 1 1 1 1 MSB bit representation of the index
          0 0 1 1 0 0 1 1
          0 1 0 1 0 1 0 1 LSB
Run Code Online (Sandbox Code Playgroud)

111的最佳分裂是011和100,总和为7.因此,为了得到仅包含第一个元素ergo 001的集合的值,你将val [1]设置为与元素1和3(101)的集合,你把val [5].

按基数分组时如何排序val数组

val[8] = {0,1,2,3,4,2,4,2}
          0 0 0 1 …
Run Code Online (Sandbox Code Playgroud)

c arrays algorithm cuda dynamic-programming

11
推荐指数
1
解决办法
552
查看次数

乐高积木 - 动态规划

我正在尝试解决以下DP问题:

您有4种类型的乐高积木,尺寸为1*1*1,1*1*2,1*1*3和1*1*4.假设您拥有无限数量的每种类型的积木.

你想在这些块中制作一个高度为H和宽度为M的墙.墙上不应有任何孔.你建造的墙应该是一个坚固的结构.坚固的结构意味着不应该沿着任何垂直线分开墙壁而不切割用于建造墙壁的任何乐高积木.块只能水平放置.墙可以建造多少种方式?

以下是我的尝试方法:用abcd表示1*1*1,1*1*2,1*1*3和1*1*4块.有效模式以粗体表示.无效模式可以被垂直线打破.

H = 1&W = 3 #valid pattern = 1
aa ab ba c

H = 2&W = 3 #valid pattern = 9
在此输入图像描述

我试图通过高度或宽度来找到递推模式,以找到H = 3&W = 3或H = 2&W = 4的值.

关于如何通过身高或体重来计算增长的任何输入?
PS墙壁总是H*W*1.

algorithm dynamic-programming

11
推荐指数
2
解决办法
9111
查看次数

如何解锁宝库中的所有箱子?

在Google Code Jam中听到以下问题.竞争已经结束,所以可以谈论它https://code.google.com/codejam/contest/2270488/dashboard#s=p3

按照旧地图,你偶然发现了恐惧海盗拉里的秘密宝库!

宝库由N个锁定的箱子组成,每个箱子只能通过特定类型的钥匙打开.此外,一旦使用钥匙打开胸部,它就永远不能再次使用.在每个胸部内,你当然会找到很多宝藏,你也可以找到一把或多把钥匙,可用来打开其他箱子.胸部可能包含多个相同类型的钥匙,您可以容纳任意数量的钥匙.

您已经拥有至少一个密钥,并且您的地图显示了在各个箱子中可以找到的其他密钥.有了这些信息,您能想出如何解锁所有的箱子吗?

如果有多种方法可以打开所有箱子,请选择"按字典计算最小"的方式.

对于比赛,有两个数据集,一个包含最多20个箱子的小数据集,以及一个大到200个箱子的大型数据集.

我的回溯分支定界算法只能快速地解决小数据集.什么是更快的算法?

algorithm dynamic-programming

11
推荐指数
2
解决办法
2206
查看次数

Haskell:为什么这样做 - 一个记忆的例子?

嗨,我正在从Memoization看这个例子:

memoized_fib :: Int -> Integer
memoized_fib = (map fib [0 ..] !!)
    where fib 0 = 0
          fib 1 = 1
          fib n = memoized_fib (n-2) + memoized_fib (n-1)
Run Code Online (Sandbox Code Playgroud)

我只是想知道为什么这甚至可以工作,因为对我来说,如果你打电话,memoized_fib(n-2)那么你正在"创建"一个新列表并用它做事情,在你从它返回后,包含部分结果的列表将会消失?所以memorized_fib(n-1)不会从中受益吗?

haskell memoization dynamic-programming lazy-evaluation

11
推荐指数
2
解决办法
943
查看次数

是动态编程回溯缓存

我一直想知道这件事.没有书明确说明这一点.

回溯正在探索所有可能性,直到我们发现一种可能性无法引导我们找到可能的解决方案,在这种情况下我们放弃它.

据我所知,动态编程的特点是重叠的子问题.那么,动态编程是否可以表示为缓存回溯(对于以前探索过的路径)?

谢谢

theory algorithm dynamic-programming backtracking

11
推荐指数
2
解决办法
3181
查看次数

图表中的最佳路径以最大化值

我正在尝试为这个问题提出一个合理的算法:

假设我们有很多地方.我们知道每对位置之间的距离.每个位置也有一个点.目标是在从起始位置行进到目的地位置时最大化点的总和而不超过给定的距离量.

这是一个简单的例子:起始位置:C,目的地:B,给定距离量:45 在此输入图像描述

解决方案:CAB路线有9分

我只是好奇是否存在某种针对此类问题的动态算法.对于那个问题,什么是最好的,或者最简单的方法?

任何帮助是极大的赞赏.

编辑:您不能多次访问同一位置.

algorithm graph mathematical-optimization dynamic-programming

11
推荐指数
1
解决办法
1270
查看次数

金字塔动态编程

我在一次采访中遇到了这个问题而无法理解.我相信它有一个动态的编程解决方案,但它让我望而却步.

给定一些砖块,输出可能的2d金字塔总数,其中金字塔被定义为任何结构,其中一排砖块的砖块严重少于其下方的砖块.你不必使用所有砖块.

砖块只是一个正方形,连续砖块的数量是唯一重要的信息.

真的坚持这个,我认为很容易解决每个问题1 ... n迭代和总和.但是提出金字塔的数量可能与我的砖块正在躲避我.

例如,n = 6

X

XX

X
XX   XXX

X
XXX   XXXX

XX      X
XXX   XXXX   XXXXX

X
XX      XX       X
XXX   XXXX   XXXXX   XXXXXX
Run Code Online (Sandbox Code Playgroud)

所以答案是来自6块砖的13个可能的金字塔.

编辑

我很肯定这是一个动态编程问题,因为(一旦你确定了第一行)它只是查看你剩余砖块的记忆数组中的索引,看看有多少金字塔适合于顶部.

这也是情理之中的考虑宽度至少n/2的底部行,因为我们没有更多的砖上面比下面一行EXCEPT,这是我失去它,我的脑海里分崩离析,在某些(少数情况下)你可以N = 10

X
XX
XXX
XXXX
Run Code Online (Sandbox Code Playgroud)

现在底行有4个,但最左边有6个

但是当n = 11时,我们不能有低于n/2砖的底行.还有另外一种奇怪的不一致性,如n = 4,我们不能有一排n/2 = 2砖.

algorithm dynamic-programming

11
推荐指数
1
解决办法
1984
查看次数

优化:将数组划分为长度不大于k的连续子序列,使每个子序列的最大值之和最小

优化O(n^2)算法O(n log n).

问题陈述

考虑到阵列An正整数.将数组划分为长度不大于连续子序列,k使得每个子序列的最大值之和最小.这是一个例子.

如果n = 8和,k = 5和数组的元素1 4 1 3 4 7 2 2,最好的解决方案是1 | 4 1 3 4 7 | 2 2.总和将是max{1} + max{4, 1, 3, 4, 7} + max{2, 2} = 1 + 7 + 2 = 10.

O(n ^ 2)解

我们dp[i]是最低金额为问题语句子问题阵列A[0] ... A[i].dp[0] = A[0]而且,对于0 < i …

algorithm dynamic-programming

11
推荐指数
1
解决办法
745
查看次数

Memoization Handler

Is it "good practice" to create a class like the one below that can handle the memoization process for you? The benefits of memoization are so great (in some cases, like this one, where it drops from 501003 to 1507 function calls and from 1.409 to 0.006 seconds of CPU time on my computer) that it seems a class like this would be useful.

However, I've read only negative comments on the usage of eval(). Is this usage of …

python memoization dynamic-programming

10
推荐指数
2
解决办法
1066
查看次数