
链接:最小调整代价
题解:序列dp+状态
序列dp
fi中部的下标i表示前i个元素a0,a1,...,ai-1的某种性质
坐标型的fi表示以ai为结尾的某种性质
初始化中,f0表示空序列的性质

cpp
class Solution {
public:
int MinAdjustmentCost(vector<int> &A, int target) {
int len = A.size();
if (len <= 0) return 0;
// dp[i][j]:前 i 个元素调整完,且第 i 个元素调整为 j 时的最小代价
// 值域 1~100
vector<vector<int>> dp(len + 1, vector<int>(101, INT_MAX));
// 前 0 个元素,代价为 0
for (int j = 1; j <= 100; ++j) {
dp[0][j] = 0;
}
for (int i = 1; i <= len; ++i) {
for (int j = 1; j <= 100; ++j) {
// 前一个元素 k 必须满足 |k - j| <= target
for (int k = max(1, j - target); k <= min(100, j + target); ++k) {
if (dp[i - 1][k] == INT_MAX) continue;
dp[i][j] = min(dp[i][j],
dp[i - 1][k] + abs(A[i - 1] - j));
}
}
}
int result = INT_MAX;
for (int j = 1; j <= 100; ++j) {
result = min(result, dp[len][j]);
}
return result;
}
};