免费馅饼

时间:2020-06-30 12:42:17   收藏:0   阅读:45

免费馅饼 (dp \(\star\))

Input

Output

Sample Input

3 3
0 1 2 5 
0 2 1 3
1 2 1 3
1 3 1 4

Sample Output

12
-1
1
1

Hint

分析

Code

#include <bits/stdc++.h> 
const int maxn=2500+5;
int w,h,n,Time; 
int f[maxn][101]; 
int c[maxn],x[maxn],t[maxn],v[maxn];
void Read(){
    scanf("%d%d",&w,&h); 
    h--;//馅饼就在最高一格出现 
    int T,X,V,C;
    while(scanf("%d%d%d%d",&T,&X,&V,&C)==4){ 
        if(h%V==0){//到达不了舞台的不用管 
            t[++n]=T+h/V;
            x[n]=X;v[n]=V;c[n]=C; 
            Time=std::max(Time,t[n]);//记录最大的到达舞台的馅饼时间 
        } 
    }     
    memset(f,0,sizeof(f));
}
int mx(int i,int j){ 
    int ans=0; 
    for(int k=-2;k<=2;++k){
        if(j+k<0 || j+k>w)continue;
        ans=std::max(ans,f[i+1][j+k]);
    }    
    return ans; 
} 
void Solve(){
    if(!n){//n==0说明没有一个能掉到舞台的
        printf("0\n");return;
    }     
    for(int i=1;i<=n;i++)//初始化
        f[t[i]][x[i]]+=c[i];//有可能不同时刻的馅饼可能同时掉在舞台同一个位置 
    for(int i=Time-1;i>=0;i--)//从上往下好处理 
       for(int j=w;j>0;j--) //因为转移是有范围的
          f[i][j]+=mx(i,j);  
    printf("%d\n",f[0][w/2+1]);
}
int main(){ 
    Read();
    Solve();
    return 0; 
}
评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!