https://leetcode.com/problems/minimum-increments-for-target-multiples-in-an-array/description/
Tag: DP
typedef long long ll;
class Solution {
public:
int minimumIncrements(vector<int>& nums, vector<int>& target) {
int m = nums.size();
int n = target.size();
vector<ll> record(1 << n);
for (int i = 0; i < (1 << n); i++) {
ll need = 1;
for (int j = 0; j < n; j++) {
if ((i >> j) & 1) need = lcm(need, target[j]);
}
record[i] = need;
}
vector<ll> f(1 << n, LLONG_MAX);
f[0] = 0;
for (auto &x: nums) {
for (int pre = (1 << n) - 1; pre >= 0; pre--) {
if (f[pre] == LLONG_MAX) continue;
for (int cur = (1 << n) - 1; cur >= 0; cur--) {
if (pre == cur) continue;
if (pre != (pre & cur)) continue;
ll target = 1ll * (x / record[pre ^ cur] + ((x % record[pre ^ cur]) != 0)) * record[pre ^ cur];
f[cur] = min(f[cur], f[pre] + target - x);
}
}
}
return f.back();
}
};
基礎的狀態壓縮 DP,根據題目可以知道 Target 的種類就只有 4 種,所以可以透過壓縮 DP 來表示,在 index 為 i 的情況下完成某幾個 Target 所需的操作次數。