【问题标题】:How to find the maximal (longest) sequence of increasing elements in an array arr[n]?如何找到数组arr [n]中增加元素的最大(最长)序列?
【发布时间】:2016-03-03 22:34:35
【问题描述】:

我需要编写一个程序,它在数组 arr[n] 中找到递增元素的最大序列。不必连续放置元素。例如:{9, 6, 2, 7, 4, 7, 6, 5, 8, 4} -> {2, 4, 6, 8}。 我有一些使用 2 个嵌套循环和一个附加数组的准则。 到目前为止,我知道如何使用 if 语句、循环和小数组。 有什么建议请...? 到目前为止,这是我的开始(我走上正轨了吗?):

        Console.Write("Elements in array: ");
        int n = int.Parse(Console.ReadLine());
        int[] arr = new int[n];
        int[] result;

        for (int index = 0; index < arr.Length; index++)
        {
            Console.Write("Array [{0}] = ", index);
            arr[index] = int.Parse(Console.ReadLine());
        }

        for (int indexOut = 0; indexOut < n; indexOut++)
        {
            for (int indexIn = 1; indexIn < n; indexIn++)
            {

            }
        }            

【问题讨论】:

    标签: c# arrays sequence


    【解决方案1】:

    嵌套循环是一个循环内另一个循环:

    for (int 1 = 0; i < something.length; i++) {
        for ( int j = 0; j < somethingElse.length; j++) {
            // code
        }
    }
    

    我想我在这里找到了您的解决方案: http://www.geeksforgeeks.org/dynamic-programming-set-3-longest-increasing-subsequence/

        /* Dynamic Programming C/C++ implementation of LIS problem */
    #include<stdio.h>
    #include<stdlib.h>
    
    /* lis() returns the length of the longest increasing
       subsequence in arr[] of size n */
    int lis( int arr[], int n )
    {
       int *lis, i, j, max = 0;
       lis = (int*) malloc ( sizeof( int ) * n );
    
       /* Initialize LIS values for all indexes */
       for ( i = 0; i < n; i++ )
          lis[i] = 1;
    
       /* Compute optimized LIS values in bottom up manner */
       for ( i = 1; i < n; i++ )
          for ( j = 0; j < i; j++ )
             if ( arr[i] > arr[j] && lis[i] < lis[j] + 1)
                lis[i] = lis[j] + 1;
    
       /* Pick maximum of all LIS values */
       for ( i = 0; i < n; i++ )
          if ( max < lis[i] )
             max = lis[i];
    
       /* Free memory to avoid memory leak */
       free( lis );
    
       return max;
    }
    
    /* Driver program to test above function */
    int main()
    {
      int arr[] = { 10, 22, 9, 33, 21, 50, 41, 60 };
      int n = sizeof(arr)/sizeof(arr[0]);
      printf("Length of LIS is %d\n", lis( arr, n ) );
      return 0;
    }
    

    您必须对其稍作修改才能生成实际的数组。

    【讨论】:

    • 谢谢,这段代码真的帮助我理解了解决方案(而不是文本解决方案)。我在互联网上寻找更多解释,我想我明白了......
    【解决方案2】:

    我的代码:

            // Arr[]
            int n = 10;
            int[] arr = new int[n];
    
            for (int index = 0; index < n; index++)
            {
                Console.Write("Array[{0}] = ", index);
                arr[index] = int.Parse(Console.ReadLine());
            }
    
            // Len[]
            int[] len = new int[n];
            for (int index = 0; index < n; index++)
            {
                len[index] = 1;
            }
    
            // Correct len[]
            for (int indexCount = 1; indexCount < n; indexCount++)
            {
                for (int indexNumber = 0; indexNumber < indexCount; indexNumber++)
                {
                    if (arr[indexCount] > arr[indexNumber] && len[indexCount] < len[indexNumber] + 1)
                    {
                        len[indexCount] = len[indexNumber] + 1;
                    }
                }
            }
    
            // Print new len[]
            // Just to keep track of numbers
            Console.WriteLine();
            Console.Write("{");
            for (int index = 0; index < n; index++)
            {
                Console.Write(" " + len[index] + " ");
            }
            Console.WriteLine("}");
    
            // Search for the max number in len[]
            int max = int.MinValue;
            int maxPosition = 0;
            for (int index = 0; index < len.Length; index++)
            {
                if (len[index] > max)
                {
                    max = len[index];
                    maxPosition = index;
                }
            }
    
            // Create the result in result[]
            int[] result = new int[max];
            int i = (max - 1);
            int maxCount = max;
            for (int index = maxPosition; index >= 0; index--)
            {
                if (len[index] == max)
                {
                    result[i] = arr[index];
                    max--;
                    i--;
                }
            }
    
            // Print the result[]
            Console.WriteLine();
            Console.Write("{");
            for (int index = 0; index < maxCount; index++)
            {
                Console.Write(" " + result[index] + " ");
            }
            Console.WriteLine("}");
    

    【讨论】:

      【解决方案3】:
          using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      
      namespace ConsoleApplication1
      {
          class Program
          {
              static void Main(string[] args)
              {
                  int maincount = 0;
                  int indices = 0;
                  int increment = 0;
                  int count = 0;
                  int finalcount = 0;
                  int checkvalue = 0;
              
                  string consincval = null;
                  string consincval1 = null;
                  string finalconsincval = null;
                  Console.WriteLine("Enter number of rows of the array");
                  int len = int.Parse(Console.ReadLine());
      
                  Console.WriteLine("Enter number of columns of the array");
                  int wid = int.Parse(Console.ReadLine());
      
                  int[,] consecincrease = new int[len, wid];
      
                  Console.WriteLine("Enter the Values of array");
      
                  for (int index = 0; index < consecincrease.GetLength(0); index++)
                  {
      
                      for (int index1 = 0; index1 < consecincrease.GetLength(1); index1++)
                      {
                          consecincrease[index, index1] = int.Parse(Console.ReadLine());
                          Console.Write("The value of the {0} {1}" + ":" + " " + "{2}", index, index1, consecincrease[index, index1]);
                          Console.WriteLine();
                      }
      
                  }
                  for (int index = 0; index < consecincrease.GetLength(0); index++)
                  {
                      for (int index1 = 0; index1 < consecincrease.GetLength(1); index1++)
                      {
      
                          increment = 0;
                          checkvalue = consecincrease[index, index1];
      
                         for ( indices = increment; indices < consecincrease.GetLength(1)-1; indices++)
                         {
                              
                              if (checkvalue < consecincrease[index, indices +1])
                              {
                                  consincval = Convert.ToString(checkvalue);
                                  
                                  count++;
      
                                  maincount = count;
                                  checkvalue = consecincrease[index, indices+1];
                                  consincval1 = consincval1 + " " + consincval + " ";
                              }
                          }
                          if (count == 0)           
                          {   
        
                          }
                          else if  (count >= 1) 
                          {
                                  consincval = Convert.ToString(checkvalue);
      
                                  count++;
                                  maincount = count;
                                  consincval1 = consincval1 + " " + consincval + " ";
        
                          }
                          if (finalcount < maincount)
                          {
                              finalcount = maincount;
                              finalconsincval = consincval1;
      
                              count = 0;
                              consincval1 = null;
                              consincval = null;
                          }
                          else
                          {
                              count = 0;
                              consincval1 = null;
                              consincval = null;
                          }
                          increment ++;                      
                      }
                      
                  }     
                  Console.WriteLine();
                  Console.WriteLine(finalconsincval);
                  Console.ReadLine();
              }
          }
      }
              
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-09-20
        • 1970-01-01
        • 2019-08-31
        • 1970-01-01
        • 2011-04-13
        • 1970-01-01
        • 2011-06-23
        相关资源
        最近更新 更多