题目大意:n棵高为H的树,树上某些位置有柿子。猫从任意树出发,可以下降一格或到另一棵树上(下降d格),求吃到柿子的最大值
题解:
f[i][j]
表示在第i棵树,高度为j的最优答案
转移就是题目中的两种,1.下降1格,即f[i][j+1]
2.从另一棵树跳过来,下降d格。维护一个mx[i],表示高度为i时所有树的最优答案,然后直接转移即可(显然从自己所在的树往下直接下降d格是不优的,因此不需要特判)
我的收获:naive~~
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int M=2005;
int n,H,D;
int mx[M];
int a[M][M],f[M][M];
void work()
{
for(int j=H;j>=1;j--)
for(int i=1;i<=n;i++)
{
f[i][j]=max(f[i][j+1],mx[j+D])+a[i][j];
mx[j]=max(mx[j],f[i][j]);
}
cout<<mx[1]<<endl;
}
void init()
{
cin>>n>>H>>D;
int x,y;
for(int i=1;i<=n;i++){
cin>>x;
while(x--) scanf("%d",&y),a[i][y]++;
}
}
int main()
{
init();
work();
return 0;
}