类似 CSP-S2023 的 T2 ,都是短小精悍的 DP。
首先观察到,操作只有两种,一是直接超过,代价为
ai,二是通过超能力,将
ai 和
aj 调换,代价为
j−i(j>i)。
我们发现,想到达一个目的地,可以将前面较小的数字换过来,之后一直把这个1小数字换到前面再超过,如下:
第一步4,2,5,7,me第二步4,5,7,2,me第三步4,5,7,me,2第四步4,5,2,me,7第五步4,5,me,2,7
以此类推,每回把
2 提过去超越,再调回来,再超越,直到终点。
假设我们目前在位置
x,被调换的数字在位置
y,目的地是
p,显然,代价为
x−y−1 (把
ax 换到你所在位置的前一个),加上
(x−p)×ay (超越
ay 所花费的),加上
x−p−1 (把
ay 向前换,跟着我们走的花费)
总代价整理得
(x−p)×ay+x+x−y−p−2。
可以证明,要前往位置
p,我们所选的应该是
[p,x] 间
ay 最小的值 (值相同的越靠右越优)
证明:不妨设
ay1<ay2(y1,y2∈[p,x])。
则
{(x−p)×ay1+x+x−y1−p−2(x−p)×ay2+x+x−y2−p−2
上下式子相减得
y2−y1+(ay1−ay2)×(x−p)
可以证明,因为
y1,y2∈[p,x],所以
y1−y2<x−p ,又因为
(ay1−ay2)≥1,所以上述式子小于
0。
转移很显然,设
dpi 表示目前我在位置
i,抵达
1 所需的最小代价,则按式子
dpj=min(dpj,dpi+(i−j)×mi+i+i−j−pos−2)
转移即可
其中,
pos∈[j,i−1],指最小值的下标 ,
mi 指其中最小值