标签: dynamic-programming

查找字符串中子序列的出现次数

例如,让字符串为pi的前10位,3141592653子序列为123.请注意,序列出现两次:

3141592653
 1    2  3
   1  2  3
Run Code Online (Sandbox Code Playgroud)

这是一个我无法回答的面试问题,我想不出一个有效的算法而且它让我烦恼.我觉得应该可以使用一个简单的正则表达式,但是1.*2.*3不要返回每个子序列.我在Python中的天真实现(在每个1之后计算每个2的3个)已经运行了一个小时而且还没有完成.

python algorithm dynamic-programming

60
推荐指数
3
解决办法
2万
查看次数

找到两个字符串之间的公共子串

我想比较2个字符串并保持匹配,在比较失败的地方分开.

所以,如果我有2个字符串 -

string1 = apples
string2 = appleses

answer = apples
Run Code Online (Sandbox Code Playgroud)

另一个例子,因为字符串可能有多个单词.

string1 = apple pie available
string2 = apple pies

answer = apple pie
Run Code Online (Sandbox Code Playgroud)

我确信有一种简单的Python方法可以做到这一点,但我无法解决,任何帮助和解释都表示赞赏.

python string algorithm dynamic-programming time-complexity

54
推荐指数
7
解决办法
7万
查看次数

如何计算具有特定属性的大A和B之间的整数?

在编程竞赛中,以下模式出现在很多任务中:

给定数字A和B很大(可能是20个十进制数字或更多),确定具有特定属性P的A≤X≤B的整数X

SPOJ有许多这样的任务用于练习.

有趣的属性的例子包括:

  • "X的数字总和是60"
  • "X仅包含数字4和7"
  • "X是回文",这意味着X的十进制表示等于其反向(例如,X = 1234321)

我知道如果我们将f(Y)定义为这样的整数X≤Y,那么我们问题的答案就是f(B) - f(A - 1).减少的问题是如何有效地计算函数f.在某些情况下,我们可以利用某些数学属性来提出公式,但通常属性更复杂,我们在比赛中没有足够的时间.

在很多情况下是否有更通用的方法?它是否也可以用于枚举具有给定属性的数字或计算它们上的一些聚合?

其变体是找到具有给定属性的第k个数,当然可以通过使用二进制搜索和计数函数来求解.

algorithm dynamic-programming

51
推荐指数
1
解决办法
1万
查看次数

阶乘的数字之和

链接到原始问题

这不是一个功课问题.我只是觉得有人可能知道这个问题的真正解决方案.

2004年我参加了编程竞赛,出现了这个问题:

给定n,找到n!的数字之和.n可以是0到10000.时间限制:1秒.我认为每个测试集最多有100个数字.

我的解决方案非常快,但速度不够快,所以我让它运行一段时间.它构建了一组预先计算的值,我可以在我的代码中使用它.这是一个黑客攻击,但它确实有效.

但有一个人用大约10行代码解决了这个问题,它会立即给出答案.我相信它是某种动态编程,或者来自数论的东西.当时我们16岁,所以它不应该是"火箭科学".

有谁知道他可以使用什么样的算法?

编辑:如果我没有明确提出问题,我很抱歉.正如mquander所说,应该有一个聪明的解决方案,没有bugnum,只有简单的Pascal代码,几个循环,O(n 2)或类似的东西.1秒不再是约束.

我在这里发现,如果n> 5,则9除以阶乘的数字之和.我们还可以找到数字末尾有多少个零.我们可以用吗?

好的,来自俄罗斯的编程竞赛的另一个问题.给定1 <= N <= 2 000 000 000,输出N!mod(N + 1).这有点关系吗?

algorithm dynamic-programming sum-of-digits

49
推荐指数
4
解决办法
3万
查看次数

是否有通用的方法来记忆Scala?

我想记住这个:

def fib(n: Int) = if(n <= 1) 1 else fib(n-1) + fib(n-2)
println(fib(100)) // times out
Run Code Online (Sandbox Code Playgroud)

所以我写了这个,这令人惊讶地编译和工作(我很惊讶,因为fib在其声明中引用自己):

case class Memo[A,B](f: A => B) extends (A => B) {
  private val cache = mutable.Map.empty[A, B]
  def apply(x: A) = cache getOrElseUpdate (x, f(x))
}

val fib: Memo[Int, BigInt] = Memo {
  case 0 => 0
  case 1 => 1
  case n => fib(n-1) + fib(n-2) 
}

println(fib(100))     // prints 100th fibonacci number instantly
Run Code Online (Sandbox Code Playgroud)

但是当我尝试在a中声明fib时def,我得到一个编译器错误:

def foo(n: …
Run Code Online (Sandbox Code Playgroud)

scope scala memoization dynamic-programming forward-reference

48
推荐指数
3
解决办法
2万
查看次数

子集和算法

我正在研究这个问题:

该子集和问题需要输入一个组X = {x1, x2 ,…, xn}n整数和另一个整数K.问题是,以检查是否存在一个子集X'X,它的元素之和为K,并发现该子集,如果有任何.例如,如果X = {5, 3, 11, 8, 2}K = 16那么答案是YES,因为该子集X' = {5, 11}具有的总和16.实现Subset Sum的算法,其运行时间至少为O(nK).

注意复杂性O(nK).我认为动态编程可能有所帮助.

我找到了一个指数时间算法,但它没有帮助.

有人可以帮我解决这个问题吗?

algorithm dynamic-programming subset-sum

46
推荐指数
4
解决办法
5万
查看次数

递归,memoization和动态编程之间有什么区别?

可能重复:
动态编程和记忆:自上而下与自下而上的方法

我已经阅读了很多文章,但似乎无法理解它.有时递归和动态编程看起来相同,而在其他时候,memoization和动态编程看起来很相似.有人可以向我解释有什么区别吗?

PS如果您可以使用针对同一问题的三种方法向我指出一些代码,那么它也会很有帮助.(例如Fibonacci系列问题,我认为我读过的每篇文章都使用了递归,但将其称为动态编程)

algorithm recursion memoization dynamic-programming

43
推荐指数
4
解决办法
4万
查看次数

如何在惯用的Haskell中实现动态编程算法?

Haskell和其他函数式编程语言是在不维护状态的前提下构建的.我还不熟悉函数式编程的工作原理和概念,所以我想知道是否有可能以FP方式实现DP算法.

可以使用哪些函数式编程结构来做到这一点?

haskell functional-programming dynamic-programming

42
推荐指数
4
解决办法
8806
查看次数

理解动态编程的好例子,文章,书籍

我无法弄清楚动态编程的原理,我真的很想要它.DP非常强大,它可以解决这样的问题:

从数字的差异中获得尽可能低的总和

那么,你能给我推荐好的书籍或文章(最好带有真实代码的例子),它可以解释我什么是动态编程?我首先想要简单的例子,然后我会继续前进.

language-agnostic algorithm dynamic-programming

41
推荐指数
4
解决办法
5万
查看次数

动态编程 - 最大的方块

我需要在一个充满1和0的巨型文件中找到最大的1的平方.我知道我必须使用动态编程.我将它存储在2D数组中.任何有关找到最大方块的算法的帮助都会很棒,谢谢!

示例输入:

1 0 1 0 1 0
1 0 1 1 1 1
0 1 1 1 1 1
0 0 1 1 1 1
1 1 1 1 1 1
Run Code Online (Sandbox Code Playgroud)

回答:

1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
Run Code Online (Sandbox Code Playgroud)

我的代码到目前为止:

int Square (Sq[int x][int y]) {
   if (Sq[x][y]) == 0) {
       return 0;
   }
   else {
       return 1+MIN( Sq(X-1,Y), Sq(X,Y-1), Sq(X-1,Y-1) );
   }
}
Run Code Online (Sandbox Code Playgroud)

(假设已经输入数组的值)

int main() {
    int Sq[5][6]; …
Run Code Online (Sandbox Code Playgroud)

c matrix dynamic-programming

40
推荐指数
3
解决办法
3万
查看次数