查找最佳案例场景C#

时间:2012-06-13 06:45:07

标签: c# .net

我有以下要解决的问题,我不确定如何解决这个问题:

有停车场彼此相邻,它们的位置类似于一条直线。每个停车场都有一个分配给它的价值(利润)。您可以根据需要购买任意数量的批次但是它们必须彼此相邻(在连续的集合中)。

输入(这是给予/你将要输入的内容):

手数:9

每个停车场的价值:即:-5,0,7,6,4,3,5,-5,2

表示(以便于查看) 每个方框都包含每批的利润:

enter image description here

输出: 应该: 3 6 8 含义: 3 - 开始很多#, 6 - 结束很多#, 8 - 总利润(7 - 6 + 4 + 3)

如果有多个答案,程序应编写包含最少停车位数的答案。如果仍有多个可能的答案,您的程序可以编写其中任何一个。

请帮忙。提前谢谢。

编辑: 我得到了它的工作:

    /// <summary>
    /// The problem 2.
    /// </summary>
    public class MySuperAwesomeClass
    {
        #region Constants and Fields

        /// <summary>
        /// The seq end.
        /// </summary>
        private static int seqEnd = -1;

        /// <summary>
        /// The seq start.
        /// </summary>
        private static int seqStart;

        #endregion

        // Quadratic maximum contiguous subsequence sum algorithm.
        #region Public Methods and Operators

        /// <summary>
        /// The max sub sum 2.
        /// </summary>
        /// <param name="a">
        /// The a.
        /// </param>
        /// <returns>
        /// The max sub sum 2.
        /// </returns>
        public static int maxSumSub(int[] a)
        {
            int maxSum = 0;

            for (int i = 0; i < a.Length; i++)
            {
                int thisSum = 0;
                for (int j = i; j < a.Length; j++)
                {
                    thisSum += a[j];

                    if (thisSum > maxSum)
                    {
                        maxSum = thisSum;
                        seqStart = i;
                        seqEnd = j;
                    }
                }
            }

            return maxSum;
        }

        #endregion

        #region Methods

        /// <summary>
        /// The main.
        /// </summary>
        private static void Main()
        {
            Console.WriteLine("Enter N:");
            string stringInput = Console.ReadLine();
            int[] a = new int[Convert.ToInt16(stringInput)];

            Console.WriteLine("Enter profit values:");
            for (int i = 0; i < Convert.ToInt16(stringInput); i++)
            {
                string value = Console.ReadLine();
                a[i] = Convert.ToInt16(value);
            }

            int maxSum = maxSumSub(a);
            Console.WriteLine(string.Format("{0} {1} {2}", seqStart, seqEnd, maxSum));
            Console.ReadKey();
        }

        #endregion
    }

除非我无法弄清楚这一部分: 如果有多个答案,程序应编写包含最少停车位数的答案。

2 个答案:

答案 0 :(得分:0)

这是经典的最大子集和问题。没有代码,因为这是家庭作业,但这是一般的解决方案。如果您仍然卡住,我相信您可以通过搜索标题在线查找代码。

  1. 为最大子集创建第一个/最后一个索引变量。这些将保留我们答案的停车位。在你的例子中分别为3和6。
  2. 为最大子集的总和创建一个和变量。这将保留我们答案的总和。在你的例子中有8个。
  3. 制作另一组first / last / sum变量,我们将成为“当前”变量。
  4. 从停车位的开头开始。将当前的第一个和当前的最后一个变量放在开头并更新总和。
  5. 现在,您将通过移动当前最后一个变量并更新总和来遍历每个停车位。
  6. 如果当前总和大于最大到目前的总和,则将所有当前变量保存到最大到目前为止的变量中。
  7. 如果在任何时候我们的当前总和下降到负数或变为零,我们的子集不再帮助我们获得最大值,所以通过先将电流移动到当前最后一个并将当前总和重置为零来重新启动它。 / LI>
  8. 一旦我们到达最后,返回最大的远程变量

答案 1 :(得分:0)

以下是一种提示您可以提高算法效率的方法:查看每端的总数如何相加。例如,根据您提供的,从左侧总计将是-5,-5,2,-4,0,3,-2,-2,0,从右侧它们将是2,2 ,-3,0,4,-2,5,5,0。