题意:
给出n个正整数组成的序列,可以对于任意位置的数进行+1,-1操作,可以使得数变成0或负数。问最少进行几次操作能够使得这个序列变成严格上升序列。
惊喜地发现一道几乎一模一样的题:CF13C Sequence
一道要求的是严格上升序列,一道要求的是非降序列。对于严格上升序列我们很难进行操作,所以可以通过改变数值,把它转变为非降序列的要求来做。
下面给出一个套路:
原题要求:a[i]<a[j],i<j
可得:a[i]-i<=a[j]-j
所以我们把所有的a[i]变为a[i]-i
现在的要求就是非降序列了。
下面给出为什么严格上升序列难以操作的解释:
如果是非降序列,我们可以发现,最后的最优序列一定有一种情况是:序列中的数字都是原来出现过的(随便yy即可证明)。 这样,我们就可以定义 f[i][j]: 前i位非降,且第i位的数字为j(所有出现过的数字中第j大的)。
那么,如果是严格上升序列的话,最后序列中的数字,是什么,我们都不知道,那么又怎么设立方程呢?
最直接的可以写出一个O(n^3) dp。
for (register int i=1; i<=n; ++i) f[1][i]=abs(a[1]-b[i]);
for (register int i=2; i<=n; ++i)
{
for (register int j=1; j<=tot; ++j)
{
for