USACO 2009 Open SkiLessons

来源:互联网 发布:c语言接口 编辑:程序博客网 时间:2024/05/17 22:47

我们定义dp[i][j]为当能力为i,时间为j时滑过的最多的次数(也是个很显然的定义嘛)

初值为dp[1][0]=0,然后对于每个时间,有上课,滑雪,看小说三个方法,相应的搞一下就好了.

把课程捆起来放到vector里,滑雪的时间,我们可以得到一个在能力为i时,花的最少时间Ski[i](当然越少越好)

就是以下代码了.

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<vector>#define M 10005#define N 105using namespace std;struct W{    int A,t;};vector<W>Lesson[M];int dp[N][M],Ski[N];void check(int &x,int y){    if(x==-1||x<y)x=y;}int main(){    int t,s,n;    scanf("%d %d %d",&t,&s,&n);    for(int i=1;i<=s;i++){        int st,len,a;        scanf("%d %d %d",&st,&len,&a);        Lesson[st].push_back((W){a,len});    }    memset(Ski,127,sizeof(Ski));    for(int i=1;i<=n;i++){        int a,t;        scanf("%d %d",&a,&t);        Ski[a]=min(Ski[a],t);    }    for(int i=1;i<N;i++)Ski[i]=min(Ski[i-1],Ski[i]);    memset(dp,-1,sizeof(dp));    dp[1][0]=0;    for(int i=0;i<t;i++)        for(int j=0;j<N;j++)            if(dp[j][i]!=-1){                check(dp[j][i+1],dp[j][i]);                for(int l=0;l<Lesson[i].size();l++){                    W now=Lesson[i][l];                    int A=now.A,T=now.t;                    check(dp[A][i+T],dp[j][i]);                }                if(i+Ski[j]<=t)check(dp[j][i+Ski[j]],dp[j][i]+1);            }    int ans=0;    for(int i=0;i<N;i++)        for(int j=0;j<=t;j++)            ans=max(ans,dp[i][j]);    printf("%d\n",ans);    return 0;}


0 0
原创粉丝点击