dp的思路,感觉和题解差不多,只是我是从高向低的
#include <iostream>
#include <vector>
#include <queue>
#include <stack>
#include <algorithm>
#define ll long long
#define N 5010
using namespace std;
int n, h, delta;
int nums[N];
int counts[N][N], dp[N][N];
int main() {
scanf("%d%d%d", &n, &h, &delta);
for (int i = 0; i < n; i++) {
scanf("%d", &nums[i]);
for (int j = 0; j < nums[i]; j++) {
int pos;
scanf("%d", &pos);
counts[pos][i]++;
}
}
for (int i = h; i>= 0; i--) {
int Max = 0;
if (i <= h - 2) {
for (int j = 0; j < n; j++) {
Max = max(Max, dp[i+2][j]);
}
}
for (int j = 0; j < n; j++) {
dp[i][j] = max(Max, dp[i+1][j]) + counts[i][j];
}
}
int ans = 0;
for (int j = 0; j < n; j++) {
ans = max(ans, dp[0][j]);
}
printf("%d\n", ans);
}