提问人:ColinXu 提问时间:11/20/2019 最后编辑:ColinXu 更新时间:11/7/2023 访问量:233
以最低的能源成本过河
Cross the river with minimum energy cost
问:
有一座桥有2条车道,每条车道有n块木板,每块木板上刻着一个数字,代表通过它所需的能源成本。您最多有 k 次机会从一条车道切换到另一条车道。如何选择路径,使能源成本最小化?
以上是问题场景。所以把它翻译成代码,我认为它的意思是:
There are 2 arrays, for example:
CASE 1: CASE 2:
lane A lane B lane A lane B
board5 5 4 board5 2 4
board4 9 5 board4 9 5
board3 3 4 board3 3 4
board2 5 1 board2 5 1
board1 1 3 board1 1 3
在本例中,n = 5 ,假设 k = 2,这意味着我们最多可以切换 2 次车道。
SO:
The best path should be:
CASE 1: CASE 2:
lane A lane B lane A lane B
board5 4 board5 2
board4 5 board4 5
board3 4 board3 4
board2 1 board2 1
board1 1 board1 1
请注意,在上述情况下,我从泳道 A 开始,因为这是一个更好的答案,但我们可以从泳道 B 开始,就好像我们可以找到更好的路径一样!
当 n,k 是任何其他数字时,如何选择最佳路径? 而且,在这个问题中,车道数始终是 2,但如果有 3 条或更多车道怎么办?
编辑1:我编写了一个方法来获取所有可能的路径,如下所示:
static ArrayList<String> pathList = new ArrayList<String>();
static int[][] arrayTree; //store 2 arrays as one 2-demension array
public static void findNext(int nextLevel, String path){
if(nextLevel > arrayTree.length - 1){
pathList.add(path);
return;
}
for (int i = 0; i < arrayTree[nextLevel].length; i++) {
if(i == 1 && path.length() != 0){
path = path.substring(0, path.length() - 2);
}
path += arrayTree[nextLevel][i] + " ";
findNext(nextLevel + 1, path);
}
}
下一步是找到所有开关不超过 k 次的路径,并找到一条成本最低的能量。
虽然这是解决问题的一种方式,但背后的想法是列举所有的可能性,然后进行计算。
但是,一定有一些更方便的方法,也许使用一些数据结构或算法或动态规划(用于决策过程)知识......
如果对这个问题有任何其他想法,请告诉我......多谢!
答:
在我看来,您可能需要一种算法来计算所有可能的路径,同时考虑到开关的最大数量。我想说的是,您应该开始尝试在没有开关限制的情况下这样做,尝试获得所有可能的组合:
A-A-A-A-B、A-A-A-B-B、A-B-B-A-B、B-A-B-B-A-B-B-
如果您有多条车道,您可以切换到其他任何一条车道还是只切换到当前车道旁边的车道?这是你必须考虑的事情。
总而言之:从小事做起,将你的工作分成更容易实现的小任务。试着在一张纸上设计你的算法,画一些图表并在开始编码之前进行处理,而不清楚你必须做什么。流程图在这里应该会有所帮助。
我希望我的建议对您有所帮助。 PS:这个周末我会尝试自己解决这个问题。
评论
public class CrossRiver {
static int minEnergy = Integer.MAX_VALUE;
static void minCrossEnergy(int arr[][], int totalEnergy, int currentLane, int step, int k, String result)
{
if(step == arr[0].length) {
if(totalEnergy < minEnergy) {
minEnergy = totalEnergy;
System.out.println("new min found: " + minEnergy + " result: " + result);
}
else {
System.out.println("completed: " + totalEnergy + " result: " + result);
}
}
else {
minCrossEnergy(arr, totalEnergy + arr[currentLane][step], currentLane, step + 1, k, result + String.valueOf(currentLane));
if (k > 0)
minCrossEnergy(arr, totalEnergy + arr[1 - currentLane][step], 1 - currentLane, step + 1, step == 0 ? k : k - 1, result + String.valueOf(1 - currentLane));
}
}
public static void main(String[] args)
{
int arr[][] = {
{1, 5, 3, 9, 5},
{3, 1, 4, 5, 4},
};
minCrossEnergy(arr, 0, 0, 0, 2, "");
}
}
上一个:以最低的能源成本过河
评论