簡體   English   中英

如何解決這個動態編程問題?

[英]How do I solve this dynamic programming problem?

我正在使用C ++語言。

馬克有'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)

第5種方式:-( 3 + 1 + 2)

第6種方式:-( 3 + 2 + 1)

第7種方式:-( 2 + 2 + 2)

格式:-(第一天選擇+第二天選擇+第三天選擇)

約束:-1 <= N <= 10 ^ 5。

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

如果您知道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 = nx

我們知道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 = nx

因此,對於該方程式,可以存在或不存在,使得y和z為整數。

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

找到y和z之后,我們可以使用來計算x的排列

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

因此,如果沒有任何解決方案,則應跳過當前的x。
通過這種方式,計算從0到n的每個x的y和z並將它們求和。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM