【BZOJ】1270 [BeijingWc2008]雷涛的小猫
【算法】DP
【题解】f1[i]表示第i棵树当前高度能得到的最多果子数
f2[i]表示高度i能得到的最多果子数。
于是有:
f1[j]=max(f1[j],f2[i+delta])+mp[j][i];
f2[i]=max(f2[i],f1[j]);
注意i+delta的范围。
#include<cstdio> #include<cctype> #include<algorithm> using namespace std; const int maxn=2010; int f1[maxn*3],f2[maxn*3],mp[maxn][maxn],n,h,delta; int read() { char c;int s=0; while(!isdigit(c=getchar())); do{s=s*10+c-'0';}while(isdigit(c=getchar())); return s; } int main() { n=read(),h=read(),delta=read(); for(int i=1;i<=n;i++) { int m,k; m=read(); for(int j=1;j<=m;j++)k=read(),mp[i][k]++; } for(int i=h;i>0;i--) { for(int j=1;j<=n;j++) { f1[j]=max(f1[j],f2[i+delta])+mp[j][i]; f2[i]=max(f2[i],f1[j]); } } printf("%d",f2[1]); return 0; }