题目大意:一只猫,可以在若干颗数之间瞎蹦,每次瞎蹦需要下降k的长度,到达一个点就获得该点的收益,问最大收益。
题解:SBDP,F1[i]表示高度为i的时候最大值是多少,F2[i]表示在第i棵树上时的最大权值为多少,随便写写就行了。
#include<bits/stdc++.h>
using namespace std;
int mapp[5000][5000];
int f1[5000];
int f2[5000];
int main()
{
int n,h,d;
scanf("%d%d%d",&n,&h,&d);
for(int i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
for(int j=1;j<=x;j++)
{
int y;
scanf("%d",&y);
mapp[i][y]++;
}
}
for(int i=h;i>=1;i--)
{
int temp=i+d>h?0:f1[i+d];
for(int j=1;j<=n;j++)
{
f2[j]=max(f2[j],temp)+mapp[j][i];
f1[i]=max(f1[i],f2[j]);
}
}
cout<<f1[1];
return 0;
}