免费馅饼——移动dp
免费馅饼
题目描述
SERKOI最新推出了一种叫做“免费馅饼”的游戏:
游戏在一个舞台上进行。舞台的宽度为 \(W\) 格,天幕的高度为 \(H\) 格,游戏者占一格。
开始时游戏者站在舞台的正中央,手里拿着一个托盘。下图为天幕的高度为 \(4\) 格时某一个时刻游戏者接馅饼的情景。
游戏开始后,从舞台天幕顶端的格子中不断出现馅饼并垂直下落。游戏者左右移动去接馅饼。游戏者每秒可以向左或向右移动一格或两格,也可以站在原地不动。
馅饼有很多种,游戏者事先根据自己的口味,对各种馅饼依次打了分。同时,在 \(3-308\) 电脑的遥控下,各种馅饼下落的速度也是不一样的,下落速度以格/秒为单位。
当馅饼在某一秒末恰好到达游戏者所在的格子中,游戏者就收集到了这块馅饼。
写一个程序,帮助我们的游戏者收集馅饼,使得所收集馅饼的分数之和最大。
输入格式
输入文件的第一行是用空格隔开的两个正整数,分别给出了舞台的宽度 \(W\) ( \(1\) 到 \(99\) 之间的奇数)和高度 \(H\) ( \(1\) 到 \(100\) 之间的整数)。
接下来依馅饼的初始下落时间顺序给出了所有馅饼的信息。每一行给出了一块馅饼的信息。由四个正整数组成,分别表示了馅饼的初始下落时刻( \(0\) 到 \(1000\) 秒),水平位置、下落速度( \(1\) 到 \(100\) )以及分值。游戏开始时刻为 \(0\) 。从 \(1\) 开始自左向右依次对水平方向的每格编号。
输入文件中同一行相邻两项之间用一个或多个空格隔开。
输出格式
输出文件的第一行给出了一个正整数,表示你的程序所收集的最大分数之和。
样例
样例输入
3 3
0 1 2 5
0 2 1 3
1 2 1 3
1 3 1 4
样例输出
12
数据范围与提示
馅饼个数
\in [0,2500]
思路
移动 \(dp\) ,重在移动,但是两个物体都移动处理起来还是很麻烦的,所以定馅饼不动,让人动,去接馅饼。
但是要注意的是馅饼在第 \(i\) 秒到第 \(i+1\) 秒的降落过程中,不可被接到,相当于闪现,在过程中不可选中。
所以只有在高度能够被速度整除的时候,才可以被接到,所以有的馅饼可以除去,不考虑。
设 \(f[i][j]\) 为在第 \(i\) 时刻,小人在第 \(j\) 的坐标,能够接到的最大值。
用 \(k\) 枚举小人移动的距离 \((-2、-1、0、1、2)\) ,动态转移方程:
\(f[i][j]=min(f[i][j],f[i-1][j+k]+a[i][j])\)
代码
#include <bits/stdc++.h>
using namespace std;
const int maxn=2500+50;
int w,h;
int dp[maxn][maxn];
int maxtime;
int dx[5]={0,1,-1,2,-2};
struct Node{
int t0;
int t1;
int a0;
int v;
int w;
}e[maxn];
int Cala(int t,int now){
int ans=0;
for(int i=0;i<=5;i++){
if(now+dx[i]<0||now+dx[i]>w)continue;//如果走出了横坐标的范围,直接跳过
ans=max(ans,dp[t+1][now+dx[i]]);
}
return ans;
}
int main(){
scanf("%d%d",&w,&h);
h--;
int tot=1;
while(~scanf("%d%d%d%d",&e[tot].t0,&e[tot].a0,&e[tot].v,&e[tot].w)){
if(h%e[tot].v==0){//只有在高度能够被速度整除的时候,才可以被接到
e[tot].t1=e[tot].t0+h/e[tot].v;
maxtime=max(maxtime,e[tot].t1);
tot++;
}
}
if(tot==1){//若没有馅饼可接,直接输出0
printf("0\n");
return 0;
}
if(w==1){//若宽度只有1,直接将全部求和
int sum=0;
for(int i=1;i<=tot;i++){
if(e[i].a0==1){
sum+=e[i].w;
}
}
printf("%d\n",sum);
return 0;
}
for(int i=1;i<=tot;i++){//初始化
dp[e[i].t1][e[i].a0]+=e[i].w;
}
for(int i=maxtime-1;i>=0;i--){
for(int j=w;j>=1;j--){
dp[i][j]+=Cala(i,j);
}
}
printf("%d\n",dp[0][w/2+1]);
return 0;
}
免费馅饼——移动dp的更多相关文章
- HDU 1176:免费馅饼(DP,自认为很详细的解释)
免费馅饼 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- kuangbin专题十二 HDU1176 免费馅饼 (dp)
免费馅饼 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- HDU - 1176 免费馅饼 【DP】
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1176 思路 因为刚开始的起点是固定的 但是终点不是固定的 所以我们可以从终点往起点推 dp[i][j] ...
- G - 免费馅饼 基础DP
都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的10米范围内.馅饼如果掉在了地上当然就 ...
- HDU 1176 免费馅饼(DP)
点我看题目 题意 : 中文题.在直线上接馅饼,能接的最多是多少. 思路 :这个题其实以前做过.....你将这个接馅饼看成一个矩阵,也不能说是一个矩阵,反正就是一个行列俱全的形状,然后秒当行,坐标当列, ...
- HDU 1176 免费馅饼:dp
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1176 题意: 横坐标范围为[0,10],你在第0秒站在坐标为5的地方. 在接下来的一段时间内,会有n个 ...
- hdoj1176 免费馅饼(dp 数塔)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1176 思路: 这道题不复杂,很明显是个dp题,数据比较大,搜索应该会超时,想到如何初始化,注意细节就差 ...
- HDU1176免费馅饼(DP)
都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的10米范围内.馅饼如果掉在了地上当然就 ...
- HDU1176:免费馅饼(dp,数字三角形的应用)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1176 这题就是数字三角行的变形,可惜对于我这个渣渣来说就是没发现,区别是他可以保持在三个点,他左边的点,右 ...
随机推荐
- java代码(13) ---Predicate详解
Predicate详解 遇到Predicate是自己在自定义Mybatis拦截器的时候,在拦截器中我们是通过反射机制获取对象的所有属性,在查看这些属性上是否有我们自定义的UUID注解 如果有该注解,那 ...
- 2018年全国多校算法寒假训练营练习比赛(第二场)H-了断局
题目描述 既然是了断局了,大家就随便玩玩数字呗.已知一个数列前十项分别是{0, 1, 1, 2, 4, 7, 13, 24, 44, 81},小G不满足呀:我要更多的数!!!不给就不让你们玩了.小G会 ...
- Say Something About Of Flash Android
Why am I need say something about of flash android? It's at my college life when I touch flash andro ...
- [AGC034F]RNG and XOR
题目 点这里看题目. 分析 第一步可以将\(A\)数组转化成概率\(P(j)\):每一步操作异或\(j\)的概率. 接着发现,\(x\)从\(0\)变成\(i\)的期望等于\(x\)从\( ...
- Moco测试知多少?
什么是mock? Mock就是在测试过程中,对于一些不容易构造/获取的对象,创建一个mock对象来替代它,帮助我们测试这种场景. 一般前端工程师会在后端工程师还没有完成后台接口开发的时候,自己根据事先 ...
- 旷世提出类别正则化的域自适应目标检测模型,缓解场景多样的痛点 | CVPR 2020
论文基于DA Faster R-CNN系列提出类别正则化框架,充分利用多标签分类的弱定位能力以及图片级预测和实例级预测的类一致性,从实验结果来看,类该方法能够很好地提升DA Faster R-CNN系 ...
- JavaScript DOM 注册事件
一个HTML是一个DOM树,每一个节点都是DOM对象,整个HTML其实也是一个DOM对象,根节点是<html>; 在HTML页面初始化的时候,JavaScript会自动帮DOM对象注册消息 ...
- 01-最大子列和问题(java)
问题描述:给定N个整数的序列{A1,A2,A3,…,An},求解子列和中最大的值. 这里我们给出{-2,11,-4,13,-5,-2}这样一个序列,正确的最大子列和为20 该题是在数据结构与算法中经常 ...
- Linux下9种优秀的代码比对工具推荐
大家好,我是良许. 在我们编写代码的时候,我们经常需要知道两个文件之间,或者同一个文件不同版本之间有什么差异性.在 Windows 下有个很强大的工具叫作 BeyondCompare ,那在 Linu ...
- windows操作系统查看端口,关闭端口进程
根据端口号查找进程 netstat -ano | findstr "端口号" 杀死进程 taskkill /pid "pid(最后一个数值)" /f