在距离原点的距离的直线上给出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点,在那里它将增加一个单位的能量,我们将到达目的地
现在我们希望找到开始到达最终目的地所需的最低能量。
答案 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]);