不理解的话就把样例代入试试,其实也没什么,动态规划,一层一层的推导。
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<string.h>
using namespace std;
long long n;
long long h;
long long delta;
long long dp[2050][2050];
long long a[2050][2050];
long long Ans[2050];
void LeiTao(){
long long i,j,k;
long long temp;
long long t;
scanf("%lld",&n);
scanf("%lld",&h);
scanf("%lld",&delta);
memset(a,0,sizeof(a));
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++){
scanf("%lld",&temp);
for(j=1;j<=temp;j++){
scanf("%lld",&t);
a[i][t]++;
}
}
long long ans=0;
for(int i=1;i<=h;i++) {
Ans[i]=0;
for(int j=1;j<=n;j++) {
if(i>1)
dp[i][j]+=dp[i-1][j];
if(i>delta)
dp[i][j]=max(dp[i][j],Ans[i-delta]);
dp[i][j]+=a[j][i];
Ans[i]=max(Ans[i],dp[i][j]);
if(i==h) ans=max(ans,dp[i][j]);
}
}
printf("%lld",ans);
}
int main(){
LeiTao();
return 0;
}