在开始时以最小能量到达目的地

时间:2015-03-29 07:14:02

标签: algorithm dynamic-programming

在距离原点的距离的直线上给出N个点。此外,我们还提供了我们需要达到的终点。现在要处于第i点,我们应该具有X [i]的能量,并且该点将使Y [i]的利润量作为正在添加的能量。现在我们需要找出我们应该开始的最小能量,以便从原点开始到达目的地点。

示例:我们有5个点,目标点距离原点10个单位。

然后让我们说第一点是距离原点1个单位,需要2个单位的能量并且获得3个单位的利润。

第二点是距离原点2个单位,需要3个单位的能量并获得0个单位的利润。

第三点是距离原点4个单位,需要3个单位的能量并获得5个单位的利润。

第四点是距离原点8个单位,需要5个单位的能量并获得0个单位的利润。

第五点是距离原点9个单位,需要1个单位的能量并且获得2个单位的利润。

现在这个配置的答案是6.

说明:

因为如果我们从5个单位的能量开始那么

在第1点,我们有超过或等于2个单位的能量,因此利润1增加了能量,总能量为6.

在第2点,三个单位的能量将消失,只留下3个单位。

在第3点,由于能量正好是3,所以会增加利润并且总能量变为5。

在第4点,所有5个单位都将消失,我们无法前进

同样,如果我们从6开始,其中一个将能够通过第4点并到达第4点,在那里它将增加一个单位的能量,我们将到达目的地

现在我们希望找到开始到达最终目的地所需的最低能量。

2 个答案:

答案 0 :(得分:0)

您已将问题标记为动态编程。但我认为这更像是一个简单的O(n)解决方案的特殊问题。从反向开始解决问题。对于N = 5分的给定问题:

要到达目的地,第5点必须至少有1个单位的能量。现在假设您输入具有x能量单位的第五个点,那么您可以通过等式找到x的最小值:

  

x - 1 + 2> = 1
  暗示x> = 0
  但是x的最小值应为1才能达到第5点。因此x = 1。

因此,在进入第5个点到达最终目的地时,您必须至少有1个单位的能量。同样,我们可以找到进入第四点所需的最小能量值,如下所示:

  

x - 5 + 0> = 1
  暗示x> = 6

因此,为了到达目的地点,当您进入第4点时,您将需要至少6个单位的能量。

以这种方式继续,您可以找到进入第一点时所需的最少能量。这将是必要的答案。

以下working java code实现了这一点:

        for(int i=0; i<n; i++){
            req[i] = sc.nextInt();
            profit[i] = sc.nextInt();
        }

        int minReq = 1;
        for(int i=n-1; i>=0; i--){
            int minEnter = minReq+req[i]-profit[i];
            minEnter = Math.max(minEnter, req[i]);
            minReq = minEnter;
        }

        System.out.println(minReq);

答案 1 :(得分:0)

尝试:

         int[] arr = { 1, 3, 5, 8, 9, 2, 6, 7, 6, 8, 9 };

         int[] ar = new int[arr.Length];
         int step = 1;
         ar[arr.Length - 1] = -1;

         for (int i = arr.Length - 2; i >= 0; i--)
         {
             if (arr[i] == 0)
                 ar[i] = -1;
             else if (arr[i] >= step)
                 ar[i] = 1;
             else 
             {
                 int min = int.MaxValue;
                 for (int j = 1; j <=arr[i]; j++)
                 {
                     if (ar[i+j]<  min && ar[i+j]>0)
                         min = ar[i+j];
                 }
                 ar[i] =min+ 1;
             }
             step++;
             }
         Console.WriteLine(ar[0]);