【USACO】DP动态规划小测(一)
{20160927 19:30~21:30}
总分400分,我113.33,稳稳地垫底了......(十分呼应我上面的博客名,hhh~)过了这么多天我才打完所有代码,废话我也就不多说了。不过,虽然时间花费的多,但我觉得我的PG也是“博采众长”了。
-------------------------------------------------------------------------------------------------------------------------------------------------
T1 接住苹果(bcatch)
题意:有2颗苹果树,有K次移动机会,问最多能接到的苹果数。
解法:可以用f[i][j][2]或f[i][j]和g[i][j]来实现,表示掉了i个苹果,移动j次的最大值。也可以利用j的奇偶直接判断当前在的树,进而进行+1或0。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
using namespace std; const int N=,K=;
int f[N][K],g[N][K],a[N]; int mmax(int x,int y)
{ return x>y?x:y; } int main()
{
//freopen("bcatch.in","r",stdin);
//freopen("bcatch.out","w",stdout);
int n,k;
scanf("%d%d",&n,&k);
for (int i=;i<=n;i++) scanf("%d",&a[i]),a[i]--;
int x,y,ans=;
memset(f,,sizeof(f));
memset(g,,sizeof(g));
for (int i=;i<=n;i++)
for (int j=;j<=k;j++)
{
x=-a[i],y=-x;
f[i][j]=x+f[i-][j],g[i][j]=y+g[i-][j];
if (j>)
{
f[i][j]=mmax(f[i][j],x+g[i-][j-]);
g[i][j]=mmax(g[i][j],y+f[i-][j-]);
}
if (i==n) ans=mmax(ans,mmax(f[i][j],g[i][j]));
}
printf("%d\n",ans);
return ;
}
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
T2 滑雪课程(ski)
题意:有N个雪坡和S个课程。雪坡需要耗费一定的时间,且有技能点要求,课程也需要耗费一定的时间,但可以进修到一定的技能点数。问在时间T内最多能滑多少次雪坡。
有两种解法:(时间和内存哪种更优就看数据范围了~)
1.f[i][j]表示前i的时间内能力为j时能滑雪的最大次数,预处理一下p[i]为当能力为i时能花的所有雪坡中耗费时间最小的。每次分别用f[i][j]更新现在有课上便上课,和滑一次雪的状态。
注意——边界条件;只有当前状态存在(不为-1)才可拓展到其他的状态;f[i][j]除了更新上课或滑雪的,也要更新到f[i+1][j]。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std; const int T=(int)1e4+,S=,N=(int)1e5+,C=;
int f[T][C],p[C+];
struct node{int c,d;}a[N];
struct hy{int m,l,c;}b[S]; bool cmp(hy x,hy y) {return x.m<y.m;}
void upd(int &x,int y) {x=x>y?x:y;}
void upd2(int &x,int y) {x=x<y?x:y;}
int mabs(int x) {return x>?x:-x;} int main()
{
//freopen("ski.in","r",stdin);
//freopen("ski.out","w",stdout);
int t,s,n;
scanf("%d%d%d",&t,&s,&n);
for (int i=;i<=s;i++)
scanf("%d%d%d",&b[i].m,&b[i].l,&b[i].c);
sort(b,b++s,cmp);
for (int i=;i<=n;i++)
scanf("%d%d",&a[i].c,&a[i].d);
memset(p,,sizeof(p));
for (int i=;i<=n;i++)
upd2(p[a[i].c],a[i].d);
for (int i=;i<=C;i++)
upd2(p[i],p[i-]);
int tmp=,ans=;
memset(f,-,sizeof(f));
f[][]=;
for (int i=;i<=t;i++)
{
for (int j=;j<=C;j++)
{
if (f[i][j]<) continue;//
upd(f[i+][j],f[i][j]);
upd(f[i+p[j]][j],f[i][j]+);
while (b[tmp].m==i && tmp<=s && i+b[tmp].l<=t)
upd(f[i+b[tmp].l][b[tmp].c],f[i][j]), tmp++;
if (i==t) upd(ans,f[i][j]);
}
}
printf("%d\n",ans);
return ;
}
1
2.f[i]表示上了第i节课能滑雪的最大次数,预处理同上。每次f[i]存枚举上一次上了哪节课,而到这节课的时间里滑雪或上课的最佳答案。
注意——边界条件;添加时间为0和时间为t的课程,保证“有始有终”。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std; const int T=(int)1e4+,S=,N=(int)1e5+,C=;
int f[S],p[C+];
struct node{int c,d;}a[N];
struct hy{int m,l,c;}b[S]; //bool cmp(hy x,hy y) {return x.m<y.m;}
void upd(int &x,int y) {x=x>y?x:y;}
void upd2(int &x,int y) {x=x<y?x:y;}
int mabs(int x) {return x>?x:-x;} int main()
{
//freopen("ski.in","r",stdin);
//freopen("ski.out","w",stdout);
int t,s,n,ans=;
scanf("%d%d%d",&t,&s,&n);
for (int i=;i<=s;i++)
scanf("%d%d%d",&b[i].m,&b[i].l,&b[i].c);
b[].m=,b[].l=,b[].c=;
b[++s].m=t;//add terminal
//sort(b,b+1+s,cmp);//无须排序
for (int i=;i<=n;i++)
scanf("%d%d",&a[i].c,&a[i].d);
memset(p,,sizeof(p));
for (int i=;i<=n;i++)
upd2(p[a[i].c],a[i].d);
for (int i=;i<=C;i++)
upd2(p[i],p[i-]);
memset(f,-,sizeof(f));
f[]=;
for (int i=;i<=s;i++)
{
if (b[i].l+b[i].m>t) continue;//
for (int j=;j<i;j++)
if (f[j]>= && b[i].m>=b[j].m+b[j].l)//
upd(f[i],f[j]+mabs(b[i].m-b[j].m-b[j].l)/p[b[j].c]);
upd(ans,f[i]);
}
printf("%d\n",ans);
return ;
}
2
--------------------------------------------------------------------------------------------------------------------------------------------------
T3 滑雪比赛(bobsled)
题意:初始速度为1,有N个限制速度大小的弯道,给出与起点的距离,问L内最大能达到的速度。
解法:先贪心——从后往前扫一遍来保证各弯道间的限制速度可以互相到达,因为速度有后效性(?),便直接保证了不用比较下一个的限制速度,还担心降不到下一个的限制速度。
接着保存每到一个弯道后的速度与距离,进而根据与下一个弯道的速度曲线的单调性(递增(多)---递减(少)、递增、递增(少)---递减(多)、递减)来算出其间的最大值,和到下一个弯道的速度。P.S.画图辅助会清晰一点。
注意——终点也可看成一个“弯道”,而没有限制速度。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std; const int L=(int)1e9+,N=(int)1e5+;
struct node{int t,v;}
a[N]; bool cmp(node x,node y)
{
if (x.t!=y.t) return x.t<y.t;
return x.v<y.v;
}
int mmax(int x,int y)
{ return x>y?x:y; }
int mmin(int x,int y)
{ return x<y?x:y; }
int main()
{
//freopen("bobsled.in","r",stdin);
//freopen("bobsled.out","w",stdout);
int l,n;
scanf("%d%d",&l,&n);
for (int i=;i<=n;i++)
scanf("%d%d",&a[i].t,&a[i].v);
sort(a+,a++n,cmp);
int p=;a[].t=-;
for (int i=;i<=n;i++)
if (a[i].t!=a[i-].t) a[++p]=a[i];
n=p;
for (int i=n-;i>=;i--)
a[i].v=mmin(a[i].v,a[i+].v+(a[i+].t-a[i].t));
int t=,v=;//now
int x,ans=;
for (int i=;i<=n;i++)
{
if (a[i].v>v)
{
if (a[i].t-t>=a[i].v-v)//=
x=a[i].v+((a[i].t-t)-(a[i].v-v))/,v=a[i].v;
else x=v+(a[i].t-t),v=x;
ans=mmax(ans,x);
}
else
{
x=v+((a[i].t-t)-(v-a[i].v))/;
v=a[i].v;
ans=mmax(ans,x);
}
t=a[i].t;
}
ans=mmax(ans,v+(l-t));
printf("%d\n",ans);
return ;
}
--------------------------------------------------------------------------------------------------------------------------------------------------
T4 奶牛飞盘队(fristeam)
题意:有N头有一定能力的奶牛,问选出能力和为M的倍数的方案总数。
解法:要想到把%M的值作为DP数组的一个维度。f[i][j]表示在前i头奶牛中选到的能力和%M为j的方案数,这样每次只需分别选或不选当前第i头奶牛,由f[i-1]的状态推出。
注意——最后答案要 -1,因为初始f[0][0]=1是为了方便计算,而实际为0的。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
using namespace std; const int N=,M=,mod=(int)1e8;
int a[N],f[N][M]; int main()
{
//freopen("fristeam.in","r",stdin);
//freopen("fristeam.out","w",stdout);
int n,m;
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++)
scanf("%d",&a[i]),a[i]%=m;
for (int j=;j<m;j++) f[][j]=;
f[][]=;
for (int i=;i<=n;i++)
for (int j=;j<m;j++)
{
int x=j-a[i];
if (x<) x+=m;
f[i][j]=(f[i-][j]+f[i-][x])%mod;
}
printf("%d\n",f[n][]-);
return ;
}
【USACO】DP动态规划小测(一)的更多相关文章
- Day 5 笔记 dp动态规划
Day 5 笔记 dp动态规划 一.动态规划的基本思路 就是用一些子状态来算出全局状态. 特点: 无后效性--狗熊掰棒子,所以滚动什么的最好了 可以分解性--每个大的状态可以分解成较小的步骤完成 dp ...
- DP动态规划学习笔记——高级篇上
说了要肝的怎么能咕咕咕呢? 不了解DP或者想从基础开始学习DP的请移步上一篇博客:DP动态规划学习笔记 这一篇博客我们将分为上中下三篇(这样就不用咕咕咕了...),上篇是较难一些树形DP,中篇则是数位 ...
- 树形DP——动态规划与数据结构的结合,在树上做DP
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是算法与数据结构的第15篇,也是动态规划系列的第4篇. 之前的几篇文章当中一直在聊背包问题,不知道大家有没有觉得有些腻味了.虽然经典的文 ...
- 上午小测3 T1 括号序列 && luogu P5658 [CSP/S 2019 D1T2] 括号树 题解
前 言: 一直很想写这道括号树..毕竟是在去年折磨了我4个小时的题.... 上午小测3 T1 括号序列 前言: 原来这题是个dp啊...这几天出了好几道dp,我都没看出来,我竟然折磨菜. 考试的时候先 ...
- 小测几种python web server的性能
http://blog.csdn.net/raptor/article/details/8038476 因为换了nginx就不再使用mod_wsgi来跑web.py应用了,现在用的是gevent-ws ...
- hdu 3709 数字dp(小思)
http://acm.hdu.edu.cn/showproblem.php?pid=3709 Problem Description A balanced number is a non-negati ...
- [福大软工] Z班 团队作业——随堂小测(同学录) 作业成绩
团队作业--随堂小测(同学录) 作业链接 http://www.cnblogs.com/easteast/p/7763645.html 作业情况 本次作业从原先预计的3小时,有些组打了鸡血连续肝了4. ...
- 福州大学软件工程1816 | W班 第8次作业[团队作业,随堂小测——校友录]
作业链接 团队作业,随堂小测--校友录 评分细则 本次个人项目分数由两部分组成(博客分满分40分+程序得分满分60分) 博客和程序得分表 评分统计图 千帆竞发图 总结 旅法师:实现了更新,导出,查询, ...
- MySQL课堂小测
目录 一.基本知识与操作方法 二.小测具体内容 (一)向数据库表中添加记录 (二)下载并导入world.sql (三)数据库查询与输出 (四)查询数据库并求某字段和 (五)查询数据库并取最大& ...
随机推荐
- ASP.NET 如何判断当前请求是否是Ajax请求
/// <summary> /// Description:验证用户是否登陆 /// Author:xucixiao /// Date:2013- ...
- [转] SSH原理与运用(2):远程操作与端口转发
英文:阮一峰 链接:http://www.ruanyifeng.com/blog/2011/12/ssh_port_forwarding.html 接着前一次的文章,继续介绍SSH的用法. (Imag ...
- hibernate(九) 二级缓存和事务级别详讲
序言 这算是hibernate的最后一篇文章了,下一系列会讲解Struts2的东西,然后说完Struts2,在到Spring,然后在写一个SSH如何整合的案例.之后就会在去讲SSM,在之后我自己的个人 ...
- angularJS自定义那些事
angularJS在数据处理方面很优秀. 使用angularJ给我感觉就像在写模板,然后对模板填入内容,只是这些内容不在是 在html页面编写,而是以数据的方式添加进去,这个也大大提高了编写的效率. ...
- 兼容90%标准C的词法分析器
不能分词八进制和数字类型加前/后缀的情况 拿这个词法分析器跑了一遍整个Nginx源码,基本都能正确的分出结果,后面有测试例子~ #ifndef _STATES_H_ #define _STATES_H ...
- javascript学习—理解addLoadEvent函数
onload事件是HTML DOM Event 对象的一个属性,又叫事件句柄(Event Handlers),它会在页面或图像加载完成后(注意是加载完成后)立即发生. window.onload = ...
- 使用junit测试用例
通常只会使用junit测试非main方法,在我眼里就是程序入口实现而已.今天,发现原来可以测试类. 针对mybatis练习.在需要测试的UserDaoImpl类上右键,新建一个junit case,位 ...
- 第21/24周 性能监控(PAL工具)
大家好,欢迎来到性能调优培训的最后一个月.在过去的5个月里,我们谈了SQL Server的各种性能相关的话题,包括性能调优的技术和问题. 但当在你面前,SQL Server没有按你预想的运行时,你会怎 ...
- lucene 的评分机制
lucene 的评分机制 elasticsearch是基于lucene的,所以他的评分机制也是基于lucene的.评分就是我们搜索的短语和索引中每篇文档的相关度打分. 如果没有干预评分算法的时候,每次 ...
- 扩展Exception,增加判断Exception是否为SQL引用约束异常方法!
在设计数据表时,如果将某些列设置为关联其它表的外键,那么如果对其进行增加.修改操作时,其关联表若没有相匹配的记录则报错,或者在对其关联表进行删除时,也会报错,这就是外键约束的作用,当然除了外键还有许多 ...