题面在这里
水题again and again感觉自己已经颓得不行
做法:
DP。保存一个
max
避免
O(n)
转移。别的没啥好说的。
/*************************************************************
Problem: bzoj 1270 [BeijingWc2008]雷涛的小猫
User: fengyuan
Language: C++
Result: Accepted
Time: 11292 ms
Memory: 79968 kb
Submit_Time: 2017-12-15 17:13:29
*************************************************************/
#include<bits/stdc++.h>
#define rep(i, x, y) for (int i = (x); i <= (y); i ++)
#define down(i, x, y) for (int i = (x); i >= (y); i --)
#define mid ((l+r)/2)
#define lc (o<<1)
#define rc (o<<1|1)
#define pb push_back
#define mp make_pair
#define PII pair<int, int>
#define F first
#define S second
#define B begin()
#define E end()
using namespace std;
typedef long long LL;
//head
const int N = 5010, M = 2010;
int n, h, d;
int a[N][M], f[N][M], g[M];
int main()
{
scanf("%d%d%d", &n, &h, &d);
rep(i, 1, n){
int k; scanf("%d", &k);
rep(j, 1, k){
int x; scanf("%d", &x);
a[i][x] ++;
}
}
g[0] = 0;
rep(j, 1, h){
rep(i, 1, n){
f[i][j] = f[i][j-1] + a[i][j];
if (j >= d) f[i][j] = max(f[i][j], g[j-d]+a[i][j]);
g[j] = max(g[j], f[i][j]);
}
}
printf("%d\n", g[h]);
return 0;
}