[luogu 1107] [BJWC2008]雷濤的小貓 {DP}
阿新 • • 發佈:2018-12-08
題目
https://www.luogu.org/problemnew/show/P1107
解題思路
設
表示
高度在第
棵樹的最優值,
表示第
棵樹
高度的個數。
即直接往下跳
即從另一棵樹跳到這裡
明顯
是知道的,所以我們可以用
來處理第
高度的最大值。
程式碼
#include<cstdio>
#include<string>
#define rr register
using namespace std;
int f[2101][2101],n,m,h,g[2101],a[2101][2101];
inline int maxx(int x,int y){if (x>y) return x; return y;}
inline int read()
{
int p=0; char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) p=(p<<3)+(p<<1)+c-48,c=getchar();
return p;
}
int main()
{
n=read(),h=read(),m=read();
for (rr int i=1;i<=n;++i)
{
int w=read(),t;
for (rr int j=1;j<=w;++j) a[i][t=read()]++;
}
for (rr int i=h;i;--i)
{
for (rr int j=1;j<=n;++j) f[i][j]=f[i+1][j]+a[j][i];
if (i<=h-m)
for (rr int j=1;j<=n;++j)
f[i][j]=maxx(f[i][j],g[i+m]+a[j][i]);
for (rr int j=1;j<=n;++j) g[i]=maxx(f[i][j],g[i]);
}
printf("%d",g[1]);
}