これが私が問題を解決する方法です。これは必ずしも最適な解決策ではありませんが、うまくいくはずです。
配列 {1, -2, 3, 5, -4} を考えて、すべてのサブ配列を手動で記述する方法を検討してください。
- 5 要素の配列から始めます: {1, -2, 3, 5, -4} 合計: 3
- 次に、4 要素の配列を書き出します:
{1, -2, 3, 5} 合計: 7
{-2, 3, 5, -4} 合計: 2
- 3 要素配列を続けます:
{1, -2, 3} 合計: 2
{-2, 3, 5} 合計: 6
{3, 5, -4} 合計:4
- 2 要素配列:
{1, -2} 合計: -1
{-2, 3} 合計: 1
{3, 5} 合計: 8
{5, -4} 合計: 1
- 最後に、1 要素の配列:
{1} 合計: 1
{-2} 合計: -2
{3} 合計: 3
{5} 合計: 5
{-4} 合計: -4
最大の合計は 8 のようです。
配列の長さ (この場合は 5) から始めて、1 要素配列を処理するまで長さを 1 減らしたパターンがここに表示されます。また、配列の 0 番目の要素から始めて、長さを指定して有効な配列を作成しようとしました。たとえば、配列要素 0 から始まる 4 つの要素の配列で作業していた場合、配列 [0] -> 配列 [3] および配列 [1] -> 配列 [4] を介してサブ配列を作成できます (これはPython などの一部の言語には、配列スライスを実行するための明示的な表記法がありますが、C にはありません)。各スライスを生成した後、要素を合計し、完了したら最大値を探します。
さて、私はこれを次のようにコーディングします
int main(void)
{
int array[] = {1, -2, 3, 5, -4};
int max = -1; // will hold largest sum
int len = sizeof(array)/sizeof(int); // C-idiom to find length of array
for(int slen = len; slen > 0; slen--) // loop for length of sub-arrays
{
for(int jdx = 0; jdx+slen <= len; jdx++) // looping over elements in original array
{
int temp = calcSum(array, jdx, slen);
if(temp > max)
max = temp;
}
}
printf("maximum sum of sub-array is: %d\n", max);
}
あとはcalcSum
関数を書くだけです。これは 3 つのパラメーターを取ります。1 つ目は元の配列、2 つ目はサブ配列の開始位置、これはサブ配列の長さです。
int calcSum(int* array, int start, int len)
{
int sum = 0;
printf("[%d:%d]: {", start, start+len);
for(int ndx = 0; ndx < len; ndx++)
{
printf("%d,", array[start+ndx]);
sum = sum + array[start+ndx];
}
printf("} the sum is %d\n", sum);
return sum;
}
そこにいくつかの printf を散りばめたので、プログラムがループするときに何が起こっているかがわかります。私のスライス表記は [start:length] なので、[1:3] はインデックス 1 から始まり、長さが 3 の配列になります (つまり、配列 [1]、配列 [2]、配列 [3])。
上記を as としてコンパイルし、gcc -std=c99 -pedantic -Wall test.c -o temp
これを実行すると、次の結果が得られます。
D:\Users\******\GNUHome>temp.exe
[0:5]: {1,-2,3,5,-4,} the sum is 3
[0:4]: {1,-2,3,5,} the sum is 7
[1:4]: {-2,3,5,-4,} the sum is 2
[0:3]: {1,-2,3,} the sum is 2
[1:3]: {-2,3,5,} the sum is 6
[2:3]: {3,5,-4,} the sum is 4
[0:2]: {1,-2,} the sum is -1
[1:2]: {-2,3,} the sum is 1
[2:2]: {3,5,} the sum is 8
[3:2]: {5,-4,} the sum is 1
[0:1]: {1,} the sum is 1
[1:1]: {-2,} the sum is -2
[2:1]: {3,} the sum is 3
[3:1]: {5,} the sum is 5
[4:1]: {-4,} the sum is -4
maximum sum of sub-array is: 8
注意: Windows 7 Professional で gcc バージョン 4.8.3 (mingw から) を使用してこれをコンパイルしました。