[英]How can I convert this Recursive function to Iterative/Dynamic_Programming?
這個遞歸程序解決了“你有多少種方法可以在 6 個球/投球中得分至少 6 個?”的問題。
詳細信息可以在這里找到, https://stackoverflow.com/questions/60117310
這個程序運行良好。 最近,我將程序概括為任意數量的跑壘和任意數量的球/投球。
我的程序運行良好,但即使對於某些中等輸入(如 Runs = 20、Balls = 10),它也很慢。
我試圖避免使用Dynamic Programming approach (DP)
遞歸,但無法正確構建表,因為總運行次數不會正好是 20(在這種情況下),它可能是 20 到 25(考慮到得分為 6 時) 19)和球可能遠小於 10(考慮 6、6、6、6 或其他一些高得分選項)。
任何幫助將不勝感激。
這是我修改后的代碼,
static long count=0;
static int myTarget=20, balls = 10;
public static void waysToDo(int score, int target, List<Short> waySoFar)
{
if(waySoFar.size() > balls ) return; // total balls
if(score >= target)
{
count++;
return;
}
for(short i=0; i<=6; i++) // scoring options per ball
{
waySoFar.add(i);
waysToDo(score+i, target, waySoFar);
waySoFar.remove(waySoFar.size()-1);
}
}
public static void main(String[] args)
{
waysToDo(0, target, new ArrayList<Short>());
System.out.println("Total ways: "+count);
}
讓我們從基本情況開始。
如果我們只有一次迭代會發生什么? 每個結果都只能通過一種方式實現,因此:
result[0][0] = 1
result[0][1] = 1
result[0][2] = 1
result[0][3] = 1
result[0][4] = 1
result[0][5] = 1
第一個索引是迭代,第二個是分數。 價值是實現它的可能方式的數量
第二次迭代:
0
只能通過 1 種方式實現。1
,可以實現兩種方式:我們能進球1
如果先前的得分為0
,或者我們可以得分0
,如果前面的比分是1
2
可以通過 3 種方式實現: 2
+ 0
、 1
+ 1
和0
+ 2
如果我們概括我們在第n
步的結果是:
0
只有一種方式1
在第n-1
步獲得1
的方法數加上在第n-1
步獲得0
的方法數2
: result[n-1][0] + result[n-1][1] + result[n-1][2]
m
: sum result[n-1][x]
其中x
介於 0 和 m 之間6
:您不需要考慮 6 之前的值。所以 sum result[n-1][x]
,其中x
介於 0 和 5 之間。所以你最終會得到類似的東西
for(int i=1; i<6; i++){
result[0][i]=1;
}
for(int n=1; n<=maxStep; n++){
for(int i=0; i<6; i++){
result[n][i]=0;
for(int j=0; j<5; j++){
result[n][i] += result[n-1][j];
}
}
}
System.out.println(result[maxStep][5]);
如果您注意到我們只需要 current 和 previous,那么就有機會進行內存優化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.