题意:
给定的n,从方格(0,0)走到(n,n)。其中需要拐弯k次,规定k<n-1。现给出k次拐弯的单位花费,问从(0,0)到(n,n)最小的花费是多少
思路:
(0,0)在右下角,(n,n)在左上角。从(0,0)到(n,n)只能向右或向上走。那么不妨设第一次向右走,那么向右走的线段都对应了单位花费中的奇数项,向上走的线段都对应了偶数项。对于向右走的线段,遍历所有奇数项,找出最小单位花费,使得其他花费都只走一个单位,剩下的路程交由最小单位花费完成,这是向右走的最小花费。同理求出向上走的最小花费。加起来就是总的最小花费。
但完全k次拐弯后得到的最小花费不一定是最小花费,因为拐弯次数的增加会有新的单位花费,这可能会导致最小花费的增加。因此遍历k次拐弯的最小花费,每次都求出最小花费,最小值则是真正的最小花费。
核心代码:
int right, up;//向右和向上走过的花费
int minright,minup;//存放当前向右向上的最小单位花费
int ans;
right = c[1];
up = c[2];
minright = right;
minup = up;
for (int i = 3;i < n;i++){
if (i&1){
right += c[i];
minright = min(minright, c[i]);
}else{
up += c[i];
minup = min(minup, c[i]);
}
ans = min(ans, right + up + minright * (n - (i + 1) / 2) + minup * (n - i / 2));//这里向右向上走的步数可以通过i直接计算(因为在循环结尾计算ans,所以这里已经将right,up中多算的一次minright和minup减去了)
}