簡體   English   中英

最大總和

[英]Maximum sub-sum

這是我的輸入數據的示例:
5 // Number of 1D arrays, in this case we'll have array[5][3] 1 2 3 // Values of array[i][0..2] 1 1 1 1 0 0 1 1 0 2 1 0

輸出為:
12 // Maximum sum ({1 2 3} + {1 1 1} + {2 1 0} = {4 4 4} = 12) - END SUM VALUES MUST BE EQUAL(4 4 4). 3 // Number of arrays used to get this sum

問題是使用n數組查找最大和,第二條件是使用最少數量的數組。 同樣,如果sum > 300我們將停止算法。 (最大為300)。 這是我的代碼,可以得到很好的答案,但是時間復雜度是O(2 ^ n-1)。 我認為可以以某種方式保存結果並且不必多次計算相同的結果,但是我還不知道如何。

public static int[] fuel(int start, int[] sum, int counter) {
    int[] val = { sum[0] + crystal[start][0], sum[1] + crystal[start][1], sum[2] + crystal[start][2] };
    int newSum = val[0] + val[1] + val[2];

    if(newSum > 300) 
        return null;

    if(val[0] == val[1] && val[1] == val[2]) { // All 3 values have to be equal!
        if(newSum > result[0]) {
            result[0] = newSum;
            result[1] = counter;
        } else if(newSum == result[0] && result[1] > counter) {
            result[1] = counter;
        }
    }

    if(start + 1 < crystalNumber) {
        fuel(start + 1, val, counter + 1);
        fuel(start + 1, sum, counter);
    }

    return result;
}

這可能不是解決此問題的最佳算法,但它應比O(2 ^ N)更快。

這個想法是記錄遍歷輸入數組時所有可及的總和。 您可以使用一個字典,其鍵是可能的和的唯一哈希,為簡單起見,我們假設鍵是一個將三個和連接起來的字符串,例如,和[3,5,4]使用鍵“ 003005004”,字典的值將是達到該總和的最小數組數。

因此,在您的情況下:

1 2 3 => [001002003] =1
1 1 1 => [001001001] =1, [002003004]=2  (itself and use [001002003] from above)
1 0 0 => [001000000] =1, [002002003] =2, [002001001] =2, [003003004] =3
1 1 0 ...
2 1 0 ...

最后,您會發現[004004004] = 3,這就是您的答案。

這似乎也可以遍歷所有組合,所以為什么會更快,這是因為每個數字的最大和為300,所以在最壞的情況下,我們可能需要填充301 ^ 3個鍵,並且必須為每個新輸入更新它們的值陣列。 但是,它仍然是O(n),盡管常數很大,但它的運行速度仍應比O(2 ^ n)快得多。 (如果您求解300 ^ 3 * n = 2 ^ n,則n約為30-ish)

一個簡單的哈希函數將是a * 301 * 301 + b * 301 + c

我認為問題是給定m一維數組和一個數n ,使用m n數組找到最大和;

解決方案直截了當。 將每個一維數組的和保存在單獨的數組中,例如sum[]

1 2 3 = 6
1 1 1 = 3
1 0 0 = 1
1 1 0 = 2
2 1 0 = 3

排序此數組sum

6,3,3,2,1

並返回此數組的前n元素的總和。

暫無
暫無

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

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