【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 (三)数据库查询与输出 (四)查询数据库并求某字段和 (五)查询数据库并取最大& ...
随机推荐
- 深度解析SDN——利益、战略、技术、实践(实战派专家力作,业内众多专家推荐)
深度解析SDN——利益.战略.技术.实践(实战派专家力作,业内众多专家推荐) 张卫峰 编 ISBN 978-7-121-21821-7 2013年11月出版 定价:59.00元 232页 16开 ...
- TypeScript实例
interface Person { firstName: string, lastName: string } function greeter(person: Person) { return p ...
- JAVA实现Excel的读写--poi
上一篇为大家介绍了通过xls.jar的方式生成Excel的方法,本篇就为大家再介绍一下通过poi方式实现Excel文件的读写操作,内容很简单,代码注释很清晰. 1.生成Excel文件: import ...
- 编译原理(简单自动词法分析器LEX)
编译原理(简单自动词法分析器LEX)源程序下载地址: http://files.cnblogs.com/files/hujunzheng/%E6%B1%87%E7%BC%96%E5%8E%9F%E7 ...
- Netty中的坑(下篇)
其实这篇应该叫Netty实践,但是为了与前一篇名字保持一致,所以还是用一下坑这个名字吧. Netty是高性能Java NIO网络框架,在很多开源系统里都有她的身影,而在绝大多数互联网公司所实施的服务化 ...
- 【Android】[转] ANR的分析和问题处理
一:什么是ANR ANR:Application Not Responding,即应用无响应 二:ANR的类型 ANR一般有三种类型: 1. KeyDispatchTimeout(5 seconds) ...
- LocationManager使用细节
在使用系统的LocationManager请求地理位置的时候,请特别注意一个很小的细节,调用 requestLocationUpdates 以后,请记得[自己]设置一个timeout值,否则在某些情况 ...
- JAVA 设计模式 备忘录模式
用途 备忘录模式 (Memento) 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态. 这样以后就可将该对象恢复到原先保存的状态. 备忘录模式是一种行为型模式. 结构
- 我如何调优SQL Server查询
我是个懒人,我只想干尽可能少的活.当我干活的时候我不想太多.是,你没看错,这看起来很糟糕,作为一个DBA这很不合格.但在今天的文章里,我想给你展示下,当你想对特定查询创建索引设计时,你如何把你的工作和 ...
- 基于HTML5的WebGL电信网管3D机房监控应用
先上段视频,不是在玩游戏哦,是规规矩矩的电信网管企业应用,嗯,全键盘的漫游3D机房: http://www.hightopo.com/guide/guide/core/3d/examples/exam ...