题目传送门

放在14年Day1T3的dp题目...应该比较看出来是dp算法吧,因为在本蒟蒻看来求最值的算法不清晰时就是dp了==。

状态还是比较好设计的,考虑到每个情况需要记录下的量:f[i][j]表示横坐标到达i,纵坐标到达j的最小点击次数。

转移的话,也不难想,当前有两种转移方法:不点,小鸟会掉一定高度;点q次,小鸟会上升一定高度。(注意是可以连续点很多次的)

  也就能写出转移:f[i][j]=min(f[i][j],f[i-1][j-q*x[i]]+q,f[i-1][j+y[i]]),复杂度O(n*m*q),TLE。另外 开始看这个方程的时候,直观上感觉因为x[i]是增量,y[i]是减量,这个方程的符号是不是写反了?后来冷静分析一下会发现,f数组中的第二维记录的是当前的高度,因为在前一个坐标点屏幕了,所以前一个坐标会比当前低,+y[i]同理。

  我们考虑一下优化,状态好像不能再优化了,考虑转移优化。n*m的复杂度貌似才能卡都不能去掉的样子,枚举每次点的次数就很让人头大。考虑从这里出发进行优化,会不会我们多枚举了很多重复的东西。

  来自一位dalao的blog我们可以借鉴使用模拟转移法。比如x[i]=3,我们现在要转移f[3][],10位第二维上限。根据我们开始写的转移方程:

  f[3][10]=min(f[2][7]+1,f[2][4]+2,f[2][1]+3)

  f[3][7]=min(f[2][4]+1,f[2][1]+2)

  f[3][4]=min(f[2][1])

  果不其然很多重复的枚举==!我么在f[3][7]转移时,其实实际用f[i-1][j-x[i]]+1和f[i][j-1]+1来转移即可,这样就省去了那个q的复杂度。

剩下的就是一些细节问题了。

  虽说是游戏题而且每年都有一道游戏题,即使对那个现实中的游戏非常熟悉,玩的非常好也要注意一下题目背景下的游戏规则==!(比如这题我有一段时间一直玩flappybird==)在本题中,小鸟到天花板上是不会判输的,这一点比较容易忽视。

  “小鸟从游戏界面最左边任意整数高度位置出发”,这是赋初值的依据。

  “输入数据保证 P 各不相同,但不保证按照大小顺序给出”,所以输进来管道信息后要排序。

  如果当前我们选择了下降,那我们就不能再点屏幕了,所以我们先把点屏幕的情况处理掉。(分开处理)

  还有到管道的时候符不符合要求。

Code

 #include<cstdio>
#include<algorithm>
#include<cstring> using namespace std; int n,m,k,pos=,fake,ans=0x7fffffff;
int x[],y[];
int f[][];
struct tube{
int p,l,h;
}tu[]; bool cmp(tube a,tube b)
{
return a.p<b.p;
} int main()
{
scanf("%d%d%d",&n,&m,&k);
for(int i=;i<=n;i++) scanf("%d%d",&x[i],&y[i]);
for(int i=;i<=k;i++)//记录管道
scanf("%d%d%d",&tu[i].p,&tu[i].l,&tu[i].h);
sort(tu+,tu++k,cmp);//根据左端点排序
memset(f,,sizeof(f));
for(int i=;i<=m;i++) f[][i]=;//最左边开始地点不定
for(int i=;i<=n;i++)
{
if(tu[pos].p==i)//现在到管道了
{// 不能碰到管道 所以小于
for(int j=;j<tu[pos].h;j++)
//由于状态中f[i][j]中j是当前高度,所以之前高度是减去x[i]
if(j-x[i]>)
//玄学优化终于看懂了==
//然后要下课了qwq
f[i][j]=min(f[i][j],min(f[i-][j-x[i]]+,f[i][j-x[i]]+));
//每次只会向下掉一次 所以单独处理
for(int j=;j<tu[pos].h;j++)
if(j+y[i]<=m&&j>tu[pos].l)
//在管道底之上,在天花板之下
f[i][j]=min(f[i][j],f[i-][j+y[i]]);
bool flag=;
for(int j=;j<tu[pos].h;j++)
{//在管道底之上,在天花板之下
if(j<=tu[pos].l) f[i][j]=1e8;
if(f[i][j]<1e7) flag=;
}
if(!flag)
{
printf("0\n%d",pos-);
return ;
}
pos++;//这一句容易忘掉==
}
else
{
for(int j=;j<=m;j++)
if(j-x[i]>)
f[i][j]=min(f[i][j],min(f[i-][j-x[i]]+,f[i][j-x[i]]+));
for(int j=;j<=m;j++)
if(j+y[i]<=m)
f[i][j]=min(f[i][j],f[i-][j+y[i]]);
//天花板上死不掉 但是可以继续跳
//对于天花板的处理。无论在j范围内的哪个位置跳一步都会到顶
for(int j=m-x[i];j<=m;j++)// 跳一步 跳2步
f[i][m]=min(f[i][m],min(f[i][j]+,f[i-][j]+));
}
}
//遍历所有情况找最优解
for(int i=;i<=m;i++)
ans=min(ans,f[n][i]);//这个取最优解的方法貌似很可取的样子==
printf("1\n%d",ans);
return ;
}

With notes

 #include<cstdio>
#include<algorithm>
#include<cstring> using namespace std; int n,m,k,pos=,fake,ans=0x7fffffff;
int x[],y[];
int f[][];
struct tube{
int p,l,h;
}tu[]; bool cmp(tube a,tube b)
{
return a.p<b.p;
} int main()
{
scanf("%d%d%d",&n,&m,&k);
for(int i=;i<=n;i++) scanf("%d%d",&x[i],&y[i]);
for(int i=;i<=k;i++)
scanf("%d%d%d",&tu[i].p,&tu[i].l,&tu[i].h);
sort(tu+,tu++k,cmp);//输入顺序不定
memset(f,,sizeof(f));
for(int i=;i<=m;i++) f[][i]=;
for(int i=;i<=n;i++)
{
if(tu[pos].p==i)
{
for(int j=;j<tu[pos].h;j++)
if(j-x[i]>)
f[i][j]=min(f[i][j],min(f[i-][j-x[i]]+,f[i][j-x[i]]+));
for(int j=;j<tu[pos].h;j++)
if(j+y[i]<=m&&j>tu[pos].l)
f[i][j]=min(f[i][j],f[i-][j+y[i]]);
bool flag=;
for(int j=;j<tu[pos].h;j++)
{
if(j<=tu[pos].l) f[i][j]=1e8;
if(f[i][j]<1e7) flag=;
}
if(!flag)
{
printf("0\n%d",pos-);
return ;
}
pos++;
}
else
{
for(int j=;j<=m;j++)
if(j-x[i]>)
f[i][j]=min(f[i][j],min(f[i-][j-x[i]]+,f[i][j-x[i]]+));
for(int j=;j<=m;j++)
if(j+y[i]<=m)
f[i][j]=min(f[i][j],f[i-][j+y[i]]);
for(int j=m-x[i];j<=m;j++)
f[i][m]=min(f[i][m],min(f[i][j]+,f[i-][j]+));
}
}
for(int i=;i<=m;i++)
ans=min(ans,f[n][i]);
printf("1\n%d",ans);
return ;
}

Pur code

小结:这题的细节比较多,那个优化方法好像也比较难想的样子,手动模拟是个不错的选择==

NOIp 2014飞扬的小鸟【dp】By cellur925的更多相关文章

  1. NOIP 2014飞扬的小鸟(DP优化)

    题目链接  飞扬的小鸟 考场的70分暴力(实际只有50分因为数组开小了……) 考场代码(数组大小已修改) #include <cstdio> #include <cstring> ...

  2. [NOIp 2014]飞扬的小鸟

    Description Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙.如果小鸟一不小心撞到了水管或者掉 ...

  3. 飞扬的小鸟 DP

    飞扬的小鸟 DP 细节有点恶心的DP,设\(f[i][j]\)表示横坐标为\(i\)(从\(0\)开始)高度为\(j\)时,屏幕点击的最小次数为\(f[i][j]\),转移便很好写了,这里要注意枚举当 ...

  4. [NOIP2014]飞扬的小鸟[DP]

    [NOIP2014]飞扬的小鸟 ——!x^n+y^n=z^n 题目描述: Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画 ...

  5. NOIP 提高组 2014 飞扬的小鸟(记录结果再利用的DP)

    传送门 https://www.cnblogs.com/violet-acmer/p/9937201.html 参考资料: [1]:https://www.luogu.org/blog/xxzh242 ...

  6. P1941 飞扬的小鸟[dp]

    题目描述 Flappy Bird是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙.如果小鸟一不小心撞到了水管或者掉在地上的话,便宣 ...

  7. NOIP2014飞扬的小鸟[DP][WRONG]

    坑人啊朴素的dp 75分 用了完全背包才是80分,结果普遍偏小 为什么啊啊啊啊啊 等以后再写一遍吧 #include<iostream> #include<cstdio> #i ...

  8. luogu1941 [NOIp2014]飞扬的小鸟 (dp)

    设f[i][j]为到达(i,j)这个位置的最小操作数 就有$f[i][j]=min\{f[i-1][j+Y[i-1]],f[i-1][j-X[i-1]*k]+k\}$ 然后考虑优化一下转移: 对于一系 ...

  9. NOIP 2014

    Prob.1 生活大爆炸版 石头剪刀布 模拟.代码: #include<cstdio> #include<cstring> #include<iostream> u ...

随机推荐

  1. 【转载】一张“神图”看懂单机/集群/热备/磁盘阵列(RAID)

    单机部署(stand-alone):只有一个饮水机提供服务,服务只部署一份 集群部署(cluster):有多个饮水机同时提供服务,服务冗余部署,每个冗余的服务都对外提供服务,一个服务挂掉时依然可用 热 ...

  2. HDU2489 Minimal Ratio Tree 【DFS】+【最小生成树Prim】

    Minimal Ratio Tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  3. 对JS闭包的理解

    闭包,是JS里很重要的一个概念,也是相对来讲不太容易理解的一个东西,不过即使难理解,我们也要迎难而上啊,嘿嘿,网上有很多文章都在讲闭包,我在看JS设计模式的时候,书里也着重讲了闭包,但是书里官方的的确 ...

  4. java使用默认线程池踩过的坑(三)

    云智慧(北京)科技有限公司 陈鑫 重新启动线程池 TaskManager public class TaskManager implements Runnable { -.. public TaskM ...

  5. iOS APP第一次上架遇到的问题

     现在苹果审核时越来越严了,我们有两个APP时同时上线的,代码用的也是一套的.但是有其中一个是第一次发布所以就拒了,信息就是下图.大概意思是用到支付了吗?用户是怎么来的.值需要把这些信息回复了.就OK ...

  6. Python开发【第3节】【Python分支结构与循环结构】

    1.流程控制  流程: 计算机执行代码的顺序就是流程 流程控制: 对计算机代码执行顺序的管理就是流程控制 流程分类: 流程控制共分为3类: 顺序结构 分支结构/选择结构 循环结构 2.分支结构(if. ...

  7. Intellij IDEA debug jar包

    打成jar包 mvn clean install -Dmaven.test.skip=true jar包保存在target目录下 启动jar Terminal控制台执行下面的命令,启动jar java ...

  8. iOS 获取WIFI SSID及MAC地址

    NSString *ssid = @"Not Found"; NSString *macIp = @"Not Found"; CFArrayRef myArra ...

  9. 网络转载:局域网安全:解决ARP攻击的方法和原理

    局域网安全:解决ARP攻击的方法和原理 IT世界网2006-01-26 10:17   [故障原因] 局域网内有人使用ARP欺骗的木马程序(比如:传奇盗号的软件,某些传奇外挂中也被恶意加载了此程序). ...

  10. CodeForces - 55D Beautiful numbers —— 数位DP

    题目链接:https://vjudge.net/problem/CodeForces-55D D. Beautiful numbers time limit per test 4 seconds me ...