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; }