BZOJ 1571 DP
2016-10-27 19:48
113 查看
思路:
预处理出在能力值为i的时候 滑雪一次的最小时间
f[i][j]表示i时间 j的能力值 最多的滑雪次数
我先用vector 把课程按起点push进去
1.
for(int k=0;k<vec[i].size();k++){ f[i+vec[i][k].l][vec[i][k].a]=max(f[i+vec[i][k].l][vec[i][k].a],f[i][j]); }
上课
2.
f[i+1][j]=max(f[i][j],f[i+1][j]);
喝一杯可可汁
3.
f[i+land[j]][j]=max(f[i+land[j]][j],f[i][j]+1);
滑雪
//By SiriusRen #include <vector> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int t,s,n,land[105],f[20005][105]; struct Course{int m,l,a;}course[10005]; struct Land{int c,d;}jyl; vector<Course>vec[10005]; int main(){ memset(land,0x3f,sizeof(land)); scanf("%d%d%d",&t,&s,&n); for(int i=1;i<=s;i++){ scanf("%d%d%d",&course[i].m,&course[i].l,&course[i].a); vec[course[i].m].push_back(course[i]); } for(int i=1;i<=n;i++){ scanf("%d%d",&jyl.c,&jyl.d); land[jyl.c]=min(land[jyl.c],jyl.d); } for(int i=1;i<=100;i++)land[i]=min(land[i],land[i-1]); memset(f,-1,sizeof(f)); f[0][1]=0; for(int i=0;i<=t;i++){ for(int j=1;j<=100;j++){ if(f[i][j]==-1)continue; for(int k=0;k<vec[i].size();k++){ f[i+vec[i][k].l][vec[i][k].a]=max(f[i+vec[i][k].l][vec[i][k].a],f[i][j]); } f[i+1][j]=max(f[i][j],f[i+1][j]); f[i+land[j]][j]=max(f[i+land[j]][j],f[i][j]+1); } } for(int i=1;i<=100;i++)f[t][1]=max(f[t][1],f[t][i]); printf("%d\n",f[t][1]); }
相关文章推荐
- BZOJ 1571 DP
- bzoj 1005: [HNOI2008]明明的烦恼 prufer编号&&生成树计数
- bzoj 1018 堵塞的交通traffic
- 【bzoj1284】【HNOI2004】【树的计数】【组合数学+prufer数列】
- bzoj 1059: [ZJOI2007]矩阵游戏 二分图匹配
- BZOJ4519: [Cqoi2016]不同的最小割
- BZOJ 1009 GT考试
- BZOJ 3105 新Nim游戏
- 【普通莫队选讲】BZOJ2038 BZOJ3289 BZOJ3781
- 点分治[BZOJ]2599: [IOI2011]Race
- [BZOJ2432][Noi2011]兔农 矩阵乘法+exgcd
- [bzoj1055][HAOI2008]玩具取名(区间dp)
- [BZOJ2212]Tree Rotation
- bzoj2821: 作诗(Poetize)【分块】
- 【BZOJ】1507: [NOI2003]Editor(Splay)
- BZOJ 2791 Poi2012 Rendezvous 倍增LCA
- 【并查集】【生成树】【APIO 2008】【bzoj 3624】免费道路
- 【bzoj3926】[Zjoi2015]诸神眷顾的幻想乡
- 【bzoj 1606】 [Usaco2008 Dec]Hay For Sale 购买干草 01背包
- bzoj 1975 [Sdoi2010]魔法猪学院