这题是把n个数,通过加1或者减1的操作使它变成严格的增长数列。
首先介绍一下非严格递增数列的做法,最优的解法中,数列中出现的数肯定在原数列中出现过,因为对于两个相邻的数,要么把左变成右,要么把右变成左。
所以先sort一下,去重。然后就可以dp了
dp[i][j]就是指前i个数最大值不超过,去重后数组中的第j个数,
dp[i][j] = min(dp[i-1][j]+abs(a[i]-b[j]),dp[i][j-1]);
严格递增和非严格递增有什么联系呢,很多题解中都是给出对于第i个数让它减去i,然后就和非严格递增数列的做法一样了。
对于为什么,我也不是很清楚,对于非严格递增数列的两个相邻数,如果他们相等,那么通过加上他们的下标,可以让他们变成非严格递增,并且这么做是最优,意思是刚好大与1,而对于两个不相等的数,原数列变成严格递增数列和减去下标后的数列变成非严格递增数列变化的数值是一样的。
所以可以减去下标后当做非严格递增数列去做。