小苯有一个长度为n的数组 a,小红有一个长度为m的数组 b
小苯希望对a中的元素进行一些变换,使得a的所有元素都在b中出现过。具体的,他可以做任意如下操作:
- 选择i(1≤i≤n),令ai=ai+1或ai=ai−1.
小苯想在变换后,同时又能使得a单调不降,他想知道他最少需要操作多少次,请你帮帮他吧。
思路
题目要求最终的 a 数组中每个数都必须在 b 中出现过,且 a 数组最终是一个单调不降的数组,所以可以考虑确定 a 数组中最大的值,即第 n 个数的最终值。
状态定义
考虑 dp[i][j] 表示 a 的第 i 个数为 j ,前 i 个数是单调不降的最小操作次数。
状态转移
- 第 i-1 个数为 j:dp[i][j] = dp[i - 1][j] + abs(a[i]-j)
- 第 i-1 个数为 j-1 :dp[i][j] = dp[i - 1][j - 2] + abs(a[i]-j)
- 第 i-1 个数为 j-2 :dp[i][j] = dp[i - 1][j - 1] + abs(a[i]-j)
- ...