簡體   English   中英

數組中最長的子序列

[英]Longest subsequence in array

我正在嘗試使用 List 解決我的任務,我知道我非常接近解決它,但我現在被卡住了。 代碼中有問題,我無法弄清楚它是什么。 你能不能看看並幫助:

        /*
Write a program that reads an array of integers and removes from it a minimal number of elements in such way that the
remaining array is sorted in increasing order. Print the remaining sorted array.
Example: {6, 1, 4, 3, 0, 3, 6, 4, 5}  {1, 3, 3, 4, 5}
 */
using System;
using System.Collections.Generic;

class RemoveMinimalElements
{

    static void Main()
    {
        int n;
        n = int.Parse(Console.ReadLine());
        List<int> arr = new List<int>();
        List<int> sorted = new List<int>();
        int maxSubsetLenght = 0;

        for (int i = 0; i < n; i++)
        {
            arr.Add(int.Parse(Console.ReadLine()));
        }


        for (int i = 1; i <= (int)Math.Pow(2, n) - 1; i++)
        {
            int tempSubsetLenght = 0;
            string tempString = "";
            List<int> temp = new List<int>();


            for (int j = 1; j <= n; j++)
            {
                int andMask = i & (1 << j);
                int bit = andMask >> j;

                if (bit == 1)
                {
                    temp.Add(arr[n - 1 - j]);
                    tempSubsetLenght++;
                }
                if (tempSubsetLenght > maxSubsetLenght)
                {
                    maxSubsetLenght = tempSubsetLenght;

                    for(int k =1; k < temp.Count; k ++)
                    {
                        if (temp[k] >= temp[k - 1])
                        {
                            sorted = temp;
                        }
                    }
                }
            }
        }

        for (int i = sorted.Count - 1; i > 0; i--)
        {
            Console.WriteLine(sorted[i]);
        }
    }
}

我沒有遵循代碼,我只是測試了您的應用程序。

這是我的第一個輸入:5。

然后我輸入了這 5 個輸入 2,4,6,8,10 所以

arr = {2,4,6,8,10};

當涉及到最后行時,它給了我ArguementOutOfRangeException (Index was out of range. Must be non-negative and less than the size of the collection.)因為它試圖獲取 arr[item] 並且 item 是 6 所以它試圖獲取不存在的arr[6]

我不知道詳盡搜索是否適合您的情況,但這對您有用嗎?

static void Main(string[] args)
        {
            int[] input = new[] { 6, 1, 4, 3, 0, 3, 6, 4, 5 };
            int[] expectedOutput = new[] { 1, 3, 3, 4, 5 };

            int[] solution = TryGetSolution(input);

            Console.WriteLine("Input: " + FormatNumbers(input));
            Console.WriteLine("Expected Output: " + FormatNumbers(expectedOutput));
            Console.WriteLine("Output: " + FormatNumbers(solution));
            Console.ReadLine();
        }

        private static string FormatNumbers(int[] numbers)
        {
            return string.Join(", ", numbers);
        }

        private static int[] TryGetSolution(int[] input)
        {
            return TryWithoutAnyItem(input);
        }

        private static int[] TryWithoutAnyItem(int[] items)
        {
            return Enumerable.Range(0, items.Length)
                             .Select(i => TryWithoutItem(items, i))
                             .Where(solution => solution != null)
                             .OrderByDescending(solution => solution.Length)
                             .FirstOrDefault();
        }

        private static int[] TryWithoutItem(int[] items, int withoutIndex)
        {
            if (IsSorted(items)) return items;
            var removed = items.Take(withoutIndex).Concat(items.Skip(withoutIndex + 1));
            return TryWithoutAnyItem(removed.ToArray());
        }

        private static bool IsSorted(IEnumerable<int> items)
        {
            return items.Zip(items.Skip(1), (a, b) => a.CompareTo(b)).All(c => c <= 0);
        }
    }

我解決了! 非常感謝您的支持。 我是初學者,我還不能使用和理解更困難的東西,所以這是我用我已經知道的東西所做的:

/*
Write a program that reads an array of integers and removes from it a minimal number of elements in such way that the
remaining array is sorted in increasing order. Print the remaining sorted array.
Example: {6, 1, 4, 3, 0, 3, 6, 4, 5}  {1, 3, 3, 4, 5}
 */
using System;
using System.Collections.Generic;

class RemoveMinimalElements
{
    static bool CheckAscending(List<int> list)
    {
        bool ascending = true;

        for (int i = 0; i < list.Count - 1; i++)
        {
            if (list[i] > list[i + 1])
            {
                ascending = false;
            }
        }

        return ascending;
    }

    static void Main()
    {
        int n;
        n = int.Parse(Console.ReadLine());
        List<int> arr = new List<int>();
        List<int> sorted = new List<int>();
        int maxSubsetLenght = 0;

        for (int i = 0; i < n; i++)
        {
            arr.Add(int.Parse(Console.ReadLine()));
        }


        for (int i = 1; i <= (int)Math.Pow(2, n) - 1; i++)
        {
            int tempSubsetLenght = 0;
            List<int> temp = new List<int>();


            for (int j = 1; j <= n; j++)
            {
                if (((i >> (j - 1)) & 1) == 1)
                {
                    temp.Add(arr[j - 1]);
                    tempSubsetLenght++;
                }

            }

            if ((tempSubsetLenght > maxSubsetLenght) && (CheckAscending(temp)))
            {
                sorted = temp;
                maxSubsetLenght = tempSubsetLenght;
            }
        }

        for (int i = 0; i < sorted.Count; i++)
        {
            Console.WriteLine(sorted[i]);
        }
    }
}

這對我有用

   private static void FindLongestRisingSequence(int[] inputArray)
    {
        int[] array = inputArray;
         
        List<int> list = new List<int>();
        List<int> longestList = new List<int>();
        int highestCount = 1;
        for (int i = 0; i < array.Length; i++)
        {
            list.Add(array[i]);
            for (int j = i+1; j < array.Length; j++)
            {
                if (array[i] < array[j])
                {
                    list.Add(array[j]);
                    i++;
                }
                else 
                {
                    break;
                }
                i = j;
            }
            // Compare with in previous lists  
            if (highestCount < list.Count)
            {
                highestCount = list.Count;
                longestList = new List<int>(list);
            }
            list.Clear();

        }
        Console.WriteLine();

        // Print list  
        Console.WriteLine("The longest subsequence");
        foreach (int iterator in longestList)
        {
            Console.Write(iterator + " ");
        }
        Console.WriteLine();
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM