[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 } 
View Code

 

posted @ 2017-04-18 12:12  Vincent_hwh  阅读(215)  评论(0编辑  收藏  举报