题目
-
给一个整数数组,调整每个数的大小,使得相邻的两个数的差不大于一个给定的整数target,调整每个数的代价为调整前后的差的绝对值,求调整代价之和最小是多少。
-
输入: [3,5,4,7], target=2
输出: 1 -
注意事项
你可以假设数组中每个整数都是正整数,且小于等于100。
分析
- 分析可知,这是一道最优化的题目,且若该最优解由众多相似的自问题组成:某一位上的数字大小调整。此问题具有最优子结构性质,考虑用动态规划解题。
- 刻画子问题空间的好经验是:保持子问题空间尽可能的简单,只在必要时才扩展它;
- 此问题中,长度为n时的最小代价不只与相邻的子问题相关,即不可能使用一阶动态规划解决该问题,需要使用二阶动态规划。
- 利用自底向上法,从最小子问题开始,利用二维数组保存每一个子问题的最小代价。
- 由于每一个整数的范围都是 1~100,则对于最小的子问题,只含有一个数字的数组,有100种结果,即每一个子问题的结果都可能有100种,子问题的最优解是100个结果中的最小值。
- 设 d p [ i ] [ j ] dp[i][j] dp[i][j]表示问题规模为 i i i的子问题,结果为 j j j的调整代价。A表示数组。由于设置了调整区域值为target,则,对于调整结果为 j j j的子问题,只用考虑规模为 i − 1 i-1 i−1的子问题种结果为K的部分,其中 m a x ( 0 , j − t a r g e t )