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