给定参数 k 和数组 [a 0 , 1 , 2 , 3 ,..., n ] ,其中 a x 定义高度对于地形,找到使地形可以通行所需的最少工作量。如果两个相邻位置之间的差异小于或等于 k ,则地形是可通过的。可以更改 a x 处的地形高度,并且所需的工作量等于您所做的高度差。 a 0 和 n 的高度无法更改,因此某些地形可能完全无法通行。
我一直在努力解决这个问题:这是我到目前为止所想到的:当然找到一个解决方案(不需要考虑最少量的工作)很容易 - 从 a 0 到 a n ,如图中k = 2(红点是旧地形的高度,灰色的新)。
(此特定地形的输入为:k = 2,[0,2,3,2,5,4,5,7])
正如您所看到的,新地形并未将旧地形考虑在内,因此将旧地形转换为此地形所需的工作量可能很大。
确定路径是否存在是微不足道的:k> = | a 0 -a n | / n,但我不知道我该怎么回事找到最佳解决方案。
答案 0 :(得分:2)
使用单纯形法解决以下线性程序。
WorkbookSettings wbs = new WorkbookSettings();
wbs.setExcelRegionalSettings("GB");
wbs.setExcelDisplayLanguage("GB");
Locale l = new Locale("en_GB");
wbs.setLocale(l);
wbs.setEncoding("ISO8859_1");
Workbook workbook = Workbook.getWorkbook(new File("experimental-in.xls"), wbs);
答案 1 :(得分:1)
一个强力解决方案是这样的 对于每个元素,考虑三个下一个状态,一个具有h + 1,h + 0,h-1,其中h是元素的高度。现在继续遍历数组并看到以下几点 1)如果状态已经到达,则丢弃它(因此为此制作位掩码dp)
2)如果你到达一个被遍历的相邻元素diff不是k的状态,则丢弃它。
3)如果到目前为止完成的工作总量超过最低要求,则将其丢弃。
答案 2 :(得分:0)
设ht = an-a0总高度。设hAverageStep = ht / n。而k是最大的一步。
理想情况下,在步骤'i',高度差应为i * hAverageStep。在这种情况下,路径只是一个直线。我们希望更接近这一点。
对于步骤'i',你可以观察你是否需要一些“工作”来将它移动到直线上。如果该工作大于k,您还必须移动其他点,例如以前您工作不够的一些点。
如果在移动每个点之后仍然没有达到“一个”,那么就没有解决方案了。