bzoj1270: [BeijingWc2008]雷涛的小猫

来源:互联网 发布:access2007数据库教程 编辑:程序博客网 时间:2024/05/03 19:44

题面在这里
水题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;//headconst 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;}