タスクは次のとおりです。
1) 入力 = 「n」個の数字のシーケンス (n - 正、数字 - 制限なし)
2) 目的: 最長の非減少サブシーケンスを抽出します。2 つ以上のサブシーケンスが同じ長さの場合 - 一番左のものを出力します。
例: 入力 = 7 3 5 8 -1 6 7、出力 = 3 5 6 7
丸一日頭を悩ませているうちに、2 つの大きな問題に遭遇しました。1 つ目は、入力シーケンスからすべての可能な非減少サブシーケンスを格納するアルゴリズムを作成することです。2 つ目は、すべてのサブシーケンスを測定し、最も長い左端を出力するための最適な方法を考え出すことです。私が現在いる場所は次のとおりです。
using System;
class LongestNonDecreasingSequence
{
static void Main()
{
string input = Console.ReadLine();
string[] chars = input.Split(' ');
int[] numbers = new int[input.Length];
int n = chars.Length;
for(int i = 0; i < n; i++)
{
numbers[i] = int.Parse(chars[i]);
}
int[,] matrix = new int[n, n];
for(int column = 0; column < n; column++)
{
for(int row = column, rowMatrix = 0; row < n; row++)
{
if(numbers[column] <= numbers[row])
{
matrix[column, rowMatrix] = numbers[row];
rowMatrix++;
}
}
}
for(int column = 0; column < n; column++)
{
for(int row = 1; row < n; row++)
{
if(matrix[column, row] < matrix[column, row - 1] && /* ?Condition */)
{
/* Remove ?elements */
}
/* ?Remove rows, cointaining zero value */
}
}
int[] matrixLengths = new int[n];
for(int column = 0; column < n; column++)
{
matrixLengths[column] = matrix.GetLength(1);
}
}
}
各サブシーケンスを新しい列に格納する 2D 配列があります。この例では - 7 3 5 8 -1 6 7; 列 0 に 7、列 1 - 7 8、列 2 - 3 5 8 6 7、列 3 - 5 8 6 7、列 4 - 8、列 5 - -1 6 7、列 6 - 6 7、列7 - 7;
今の問題 1) すべてのサブシーケンスで、条件に適合しない数字を削除します。私たちの場合: 列 2 - 3 5 6 7、列 3 - 5 6 7;
ここで問題 2) Array.Length ですべての列 (1 ~ 7) を比較し、最大のものを取得します。
問題 1 のアルゴリズムはまだわかりません。問題 2 については、2D 配列の各列の長さを測定する方法を知る必要があるだけです。過去数時間読んだことから、2D の代わりにジャグ配列を使用する必要があるかもしれません。その場合、各列の長さを取得する方が簡単でしょうか? forループで次のジャグ配列(各列の配列)をすべて定義するのは難しいですが、文字列を使用して数値を保持し、「.Split」を使用して配列に値を割り当てることができると思います。
私は自分自身を十分に明確に表現したことを願っています。そうでない場合は、指定できますのでお知らせください。両方の問題に対する提案や情報は大歓迎です。
ありがとう!