bzoj 1571: [Usaco2009 Open]滑雪课

http://www.lydsy.com/JudgeOnline/problem.php?id=1571

 

dp[i][j]表示前i个时间,能力为j所能达到得最大滑雪次数

预处理出,需要能力$<=c$的滑坡滑行的最少时间的坡花费的时间

dp转移,三种情况

1 喝coco汁

2 滑雪

3 学习课程

具体看代码

#include<cstdio>
#include<cstring>
#include<algorithm>

const int maxn = 10007; 
int t,s,n;
inline int read() {
    int x=0;char c=getchar();
    while(c<'0'||c>'9') c=getchar();
    while(c<='9'&&c>='0') x=x*10+c-'0',c=getchar();
    return x;
}
struct node{
    int s,t,val;
}cla[maxn];
struct ppop {
    int c,d;
}po[maxn];
int dp[maxn][107];
int b[maxn];
int main() {
    t=read(),s=read(),n=read();int st=0;
    for(int i=1;i<=s;++i) {
        cla[i].s=read(),cla[i].t=read(),cla[i].val=read();
        st=std::max(st,cla[i].val);
    }
    std::memset(b,0x3f,sizeof b);
    for(int i=1;i<=n;++i) {
        po[i].c=read(),po[i].d=read();
        b[po[i].c]=std::min(b[po[i].c],po[i].d);
    }
    for(int i=1;i<=st;++i) b[i]=std::min(b[i],b[i-1]);
    for(int i=0;i<=t;++i) {
        for(int j=1;j<=st;++j) {
            dp[i][j]=-11101001;
        }
    }
    dp[0][1]=0;
    for(int i=0;i<=t;++i) {
        for(int j=1;j<=st;++j) {                //the stution have not be down
            if(dp[i][j]<0)continue;
            dp[i+1][j]=std::max(dp[i][j],dp[i+1][j]);//drink coco;
            if(i+b[j]<=t)//the time of ski
                dp[i+b[j]][j]=std::max(dp[i+b[j]][j],dp[i][j]+1);
            for(int k=1;k<=s;k++)// study
                if(i>=cla[k].s&&i+cla[k].t<t)
                    dp[i+cla[k].t][cla[k].val]=std::max(dp[i+cla[k].t][cla[k].val],dp[i][j]);
        }
    }
    int ans=0;
    for(int i=1;i<=st;++i) {
        ans=std::max(ans,dp[t][i]);
    }
    printf("%d\n",ans);
    return 0;
}

 

posted @ 2017-12-26 19:35  zzzzx  阅读(144)  评论(0编辑  收藏  举报