簡體   English   中英

如何將此遞歸函數轉換為 Iterative/Dynamic_Programming?

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

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