如何解决这个动态编程问题?

时间:2019-06-26 06:44:45

标签: algorithm optimization dynamic-programming

我正在使用C ++语言。

Mark有'N'天。最初,他在X轴上的位置(h1,0)。每天他可以去坐标(h1 + a,0)或(h1 + b,0)或(h1 + c,0)。他可以选择所需的任何一种。他每天都可以去(+ a,+ b或+ c)。 在第N天,他必须到达位置(h2,0)。 计算N天内Mark达到(h2,0)的方式。

N,h1,h2,a,b,c的值很大(坐标,a,b,c的值也可以为负,在某些情况下a = b或b = c或c = a或a = b = c)

我的方法是:-每天,我都会存储他在该天可以到达的职位以及达到该职位的数量(方式)。我正在使用地图来执行此操作。而且这种方法效率不高。

有人可以分享一种更有效的方法吗?

我必须使用的第二种方法是硬币兑换问题的变化:-)

示例:-

N = 3,h1 = 0,h2 = 6,a = 1,b = 2,c = 3

答案:-7(方式数)

第一种方式:-( 1 + 2 + 3)

第二种方式:-( 1 + 3 + 2)

第三种方式:-( 2 + 1 + 3)

第四种方式:-( 2 + 3 + 1)

第五种方式:-( 3 + 1 + 2)

第六种方式:-( 3 + 2 + 1)

第七种方式:-( 2 + 2 + 2)

格式:-(第一天选择+第二天选择+第三天选择)

约束: 1 <= N <= 10 ^ 5。

-10 ^ 9 <= h1,h2,a,b,c <= 10 ^ 9。

1 个答案:

答案 0 :(得分:2)

如果您知道a,b,c使用了多少次,那么您可以轻松地说出结果。

例如,如果我们使用a的x倍,b的y倍和c的z倍来从h1获得h2,那么可以说使用a的x倍,b的y倍和c的z倍的方式是

  

阶乘(x + y + z)/(阶乘(x)*阶乘(y)*阶乘(z))

现在我们怎么知道x,y,z的值。 x,y,z可能有很多三元组。

现在,我们可以将每个数字0到n视为x。

所以对于从0到n的每个x,

  

x a + y b + z * c =(h2-h1)
  y + z = n-x

我们知道x,a,b,c,h2,h1的值
  我们可以重写方程式,

  

y b + z c =(h2-h1-x a)
    y
b + z c = k,其中k =(h2-h1-x a)

现在解决以下方程式的问题:

  

y b + z c = k
   y + z = n-x

因此该方程式可以有解,也可以是y和z为整数。

如果有解决方案,那么这些方程式是可解决的。

找到y和z之后,我们可以使用

计算x的排列
  

阶乘(x + y + z)/(阶乘(x)*阶乘(y)*阶乘(z))

因此,如果没有任何解决方案,则应跳过当前的x。
通过这种方式,计算从0到n的每个x的y和z并将它们求和。