0

我有以下要解决的问题,但我不知道如何解决这个问题:

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

输入(这是给定的/您将输入的内容):

手数:9

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

表示(为了便于查看)每个框包含每手的利润:

在此处输入图像描述

输出:应该是: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
    }

除了我不知道这部分:如果有多个答案,程序应该写一个包含最少数量的停车场的答案。

4

2 回答 2

0

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

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

这里有一个提示,你可以让算法更高效:看看每一端的总数是如何加起来的。例如,根据您提供的内容,从左侧算起总数为 -5、-5、2、-4、0、3、-2、-2、0,从右侧算起总数为 2、2 , -3, 0, 4, -2, 5, 5, 0。

于 2012-06-13T07:08:27.863 回答