[英]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.