123题略过
第四题还算好想,公式化简后,转化为线段上顶点个数。
第五题是重点要记录的内容了。
题目大意:
可以左右走一格,代价x
可以跳一倍,代价是y。
求从0到n的最小代价。
显然
f[i]= min {
f[i-1]+x
f[i+1]+x
if i%2==0 有 f[i/2]+y
}
这显然可以最短路的……构图后跑最短路
dijkstra可以过,常数各种优化。。。(1900ms)
显然,对于f[i],最多从f[2*i] 跳回来。
然后假设f[i]从i-1过来,O(1)转移即可。
否则,可以从f[i+1]走回来,或者从f[i+3]走回来(i为奇数)
假设从f[i+1]走回来比从f[i+3]走回来更劣,
必然 f[(i+1)/2] 要比f[(i+3)/2]要大2x才行。
但是显然不可能,因为f[(i+1)/2] 可以从f[(i+3)/2]转移得到(倒退一步,距离为x)
所以情况就化简了
情况1:从前面f[i-1]直接走一步x到f[i]
情况2:i为偶数。从i/2直接跳过来
情况3: i为奇数,从(i/2)+1跳到i+1的位置,再走回来
只有这3个情况……
就做完了。
最后一题:AC自动机我回去补一补的……