最小花费(C#)

来源:互联网 发布:手机绿色上网软件 编辑:程序博客网 时间:2024/05/18 01:33

题目描述

在某条线路上有N个火车站,有三种距离的路程,L1,L2,L3,对应的价格为C1,C2,C3.其对应关系如下: 距离s           

票价 

0<S<=L1         C1 

L1<S<=L2        C2 

L2<S<=L3        C3 

输入保证0<L1<L2<L3<10^9,0<C1<C2<C3<10^9。 

每两个站之间的距离不超过L3。 当乘客要移动的两个站的距离大于L3的时候,可以选择从中间一个站下车,然后买票再上车,所以乘客整个过程中至少会买两张票。 现在给你一个 L1,L2,L3,C1,C2,C3。然后是A B的值,其分别为乘客旅程的起始站和终点站。 然后输入N,N为该线路上的总的火车站数目,然后输入N-1个整数,分别代表从该线路上的第一个站,到第2个站,第3个站,……,第N个站的距离。 根据输入,输出乘客从A到B站的最小花费。

解题思路: 

动态规划,首先初始化起始地A到目的地B的所有cost:cost[i]=cost[i-1]+newcost(i-1,i)。它是前一个节点的cost加上当前节点和前一个节点的cost的和。

但是这个cost并非是中的最优解,还需要判断当前节点在满足不换乘的前提下到前面所有节点(除了i-1)的cost。取最小的cost作为A到某个节点的最优解。这是一个动态更新的过程。

private static int query(int[] nums, int A, int B, int[] distancesAndcosts){int[] cost = new int[nums.Length + 1];cost[A] = 0;for (int i = A + 1; i <= B; i++){cost[i] = cost[i-1] + straighfordCost(nums[i] - nums[i-1],distancesAndcosts);int j = i - 2;while (j >= A && (nums[i] - nums[j]) <= distancesAndcosts[2]){if (cost[i] > (cost[j] + straighfordCost(nums[i] - nums[j],distancesAndcosts))){cost[i] = cost[j] + straighfordCost(nums[i] - nums[j], distancesAndcosts);}j--;}}return cost[B];}private static int straighfordCost(int dis,int[] distancesAndcosts){if (dis <= distancesAndcosts[0]){return distancesAndcosts[3];}else{if ((dis <= distancesAndcosts[1])){return distancesAndcosts[4];}else{return distancesAndcosts[5];}}}



0 0
原创粉丝点击