如何在数组arr [n]中找到增量元素的最大(最长)序列?

时间:2016-03-03 22:34:36

标签: c# arrays sequence

我需要编写一个程序,它在数组arr [n]中找到增加元素的最大序列。没有必要连续放置元素。例如:{9,6,2,7,4,7,5,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++)
            {

            }
        }            

3 个答案:

答案 0 :(得分:0)

嵌套循环是另一个循环:

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;
}

您必须稍微修改它才能生成实际的数组。

答案 1 :(得分:0)

我的代码:

        // 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("}");

答案 2 :(得分:0)

    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();
        }
    }
}