#include <bits/stdc++.h>
#define int long long
#define sz(a) ((int)a.size())
using namespace std;
const int N = 1e5 + 10;
int n, k;
map<int, int> numb, like;
int h[N];
int dp[510][10 * 510];
// dp[i]][j]: j个数字分给i个玩家,每个玩家得到的数字都是自己喜欢的
void solve() {
cin >> n >> k;
for (int i = 1; i <= k * n; i ++) {
int c; cin >> c;
numb[c] ++;
}
for (int i = 1; i <= n; i ++) {
int f; cin >> f;
like[f] ++;
}
for (int i = 1; i <= k; i ++) {
cin >> h[i];
}
for (int i = 1; i <= n; i ++) {
for (int j = 1; j <= k * n; j ++) {
for (int l = 0; l <= min(j, k); l ++) {
// l: 给了第i个玩家几个他喜欢的数字
dp[i][j] = max(dp[i][j], dp[i - 1][j - l] + h[l]);
}
}
}
int res = 0;
for (auto p : like) {
res += dp[p.second][numb[p.first]];
// p.first: 被玩家喜欢的数字f
// p.second: 有几个玩家喜欢f这个数字
// numb[p.first]: 卡牌中数字f的个数
}
cout << res << "\n";
}
signed main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t = 1;
// cin >> t; cin.get();
while (t --) solve();
return 0;
}
【动态规划】Cards and Joy—CF999F
于 2023-08-31 21:54:03 首次发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)