1

タスクは次のとおりです。

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」を使用して配列に値を割り当てることができると思います。

私は自分自身を十分に明確に表現したことを願っています。そうでない場合は、指定できますのでお知らせください。両方の問題に対する提案や情報は大歓迎です。

ありがとう!

4

0 に答える 0