指定された配列から最小の数値を見つけ、この数値のすべての発生を説明できます。これにより、配列が複数のサブ配列に分割され、それぞれの問題を再帰的に解決する必要があります。
例では:
1 2 3 1 2 3 (total = 0)
最小数は 1 です。
x 2 3 x 2 3 (total = 1)
これで、2 つのサブアレイができました。最初のものを解きます - 最小の数は 2 です:
x 3 (total = 2)
最後に、1 つの要素が得られます: total = 3 他の部分配列を解くと、5 になります。
C# のコードを次に示します。
int Solve(int[] ar, int start, int end){
//base for the recursion -> the subarray has single element
if(end-start == 1) return 1;
//base for the recursion -> the subarray is empty
if(end-start < 1) return 0;
//find min
int m = int.MaxValue;
for(int i = start; i < end; i++)
if (ar[i] < m) m = ar[i];
int total = 1;
//find the subarrays and their contribution recursively
int subStart = start;
for(int subEnd = start; subEnd < end; subEnd++){
if(ar[subEnd] == m) {
total += Solve(ar, subStart, subEnd);
subStart = subEnd + 1;
}
}
total += Solve(ar, subStart, ar.Length);
return total;
}