[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

 

转载于:https://www.cnblogs.com/vincent-hwh/p/6727110.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值