[bzoj1270 BJWC2008]雷涛的小猫
现在也就只能写这种水题了。。
容易想到对于每个位置,有两种来源:
从同一棵树的上方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 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<cmath> 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 }