现在也就只能写这种水题了。。
容易想到对于每个位置,有两种来源:
从同一棵树的上方1米跳下来/从其他树上方del米跳下来
用f[i][j]表示高度为i,第i棵树的最优解
f[i][j]=num[i][j]+max(f[i+1][j],f[i+del][k])
O(n^2*h)
考虑空间换时间
对于从上方del米掉下来,只需每个高度都记录一个最优解即可
1 #include2 #include 3 #include 4 #include 5 using namespace std; 6 7 const int Maxn=5000,Maxh=2000; 8 int n,h,delta; 9 int F1[Maxh+10][Maxn+10],F2[Maxh+10];10 11 void init(){12 scanf("%d%d%d",&n,&h,&delta);13 memset(F1,0,sizeof(F1));14 memset(F2,0,sizeof(F2)); 15 int T=0,t=0;16 for (int i=1;i<=n;i++){17 scanf("%d",&T);18 for (int j=1;j<=T;j++){19 scanf("%d",&t);20 F1[t][i]++;21 }22 } 23 } 24 void DP(){25 for (int Ht=h-1;Ht>=0;Ht--){26 for (int i=1;i<=n;i++){27 int num=F1[Ht+1][i];28 if (Ht+delta<=n)29 num=max(num,F2[Ht+delta]);30 F1[Ht][i]+=num;31 F2[Ht]=max(F2[Ht],F1[Ht][i]); 32 }33 } 34 }35 36 int main(){37 init();38 DP();39 int ans=0;40 for (int i=1;i<=n;i++)41 ans=max(ans,F1[0][i]);42 printf("%d",ans);43 return 0; 44 }