Time Limit: 1 second

Memory Limit: 128 MB

【问题描述】

在经过地球防卫小队的数学家连续多日的工作之后,外星人发的密码终于得以破解。它告诉我们在地球某一处的古老遗迹中,存在

有对抗这次灾难的秘密道具。防卫小队立刻派出了一个直升机小分队,迅速感到了这处遗迹。要进入遗迹,需要通过一段迷之

阶梯。登上阶梯必须要按照它要求方法,否则就无法登上阶梯。它要求的方法有以下三个限制:

1. 如果下一步阶梯的高度只比当前阶梯高1,则可以直接登上。

2. 除了第一步阶梯外,都可以从当前阶梯退到前一步阶梯。

3. 当你连续退下k后,你可以一次跳上不超过当前阶梯高度2^k的阶梯。比如说你现在位于第j步阶梯,并且是从第j + k步阶梯退下

来的。那么你可以跳到高度不超过当前阶梯高度 + 2^k的任何一步阶梯。跳跃这一次只算一次移动。

开始时我们在第1步阶梯。由于时间紧迫,我们需要用最少的移动次数登上迷之阶梯。请你计算出最少的移动步数。

[数据范围]

对于50%的数据:1 <= N <= 20

对于100%的数据:1 <= N <= 200

每步阶梯高度不超过2^31-1

【输入格式】

第1行:一个整数N,表示阶梯步数

第2行:N个整数,依次为每层阶梯的高度,保证递增

【输出格式】

第1行:一个整数,如果能登上阶梯,输出最小步数,否则输出-1

Sample Input

5

0 1 2 3 6

Sample Output

7

【题目链接】:http://noi.qz5z.com/viewtask.asp?id=t092

【题解】



代码1

动态规划

设f[i]表示到第i级阶梯所需要的最小步骤数;

f[i] = f[i-1]+1;(h[i]==h[i-1]+1);

f[i] = min(f[i],f[j+k]+k+1);

(这里k = log2(h[i]-h[j]),且j+k<=i-1)

这里第二个方程相当于从第j+k个位置跳到了第j个位置,然后再跳到i位置;

这里考虑的也是最后的结果吧;

就是第i级阶梯是怎么样走过来的;

从结果去想状态的转移;

代码2是记忆化搜索

需要调到2s才能出解



【代码1】动态规划

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define rei(x) scanf("%d",&x) const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const int MAXN = 200+10; int n;
int a[MAXN],f[MAXN],top[MAXN][32];
LL two[32]; int main()
{
//freopen("F:\\rush.txt","r",stdin);
two[0] = 1;
rep1(i,1,31)
two[i] = two[i-1]*2;
rei(n);
rep1(i,1,n) rei(a[i]);
memset(f,0x3f3f3f3f,sizeof f);
f[1] = 0;
rep1(now,2,n)
{
if (a[now]==a[now-1]+1)
f[now] = f[now-1]+1;
rep1(i,1,now-1)
{
int d = a[now]-a[i],k;
for (k = 0;k <= 31;k++)
if (two[k]>=d)
break;
if (i+k<=now-1)
f[now] = min(f[now],f[i+k]+k+1);
}
}
if (f[n]<0x3f3f3f3f)
printf("%d\n",f[n]);
else
puts("-1");
return 0;
}

【代码2】记忆化搜索

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define rei(x) scanf("%d",&x)
#define rel(x) scanf("%I64d",&x) typedef pair<int,int> pii;
typedef pair<LL,LL> pll; const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const int MAXN = 200+10; int n;
int a[MAXN],f[MAXN][32],top[MAXN][32];
LL two[32]; void dfs(int now,int k,int step)
{
if (f[now][k]<step)
return;
f[now][k] = step;
if (now==n) return;
int ma = top[now][k];
rep2(i,ma,now+1)
dfs(i,0,step+1);
if (now>1)
dfs(now-1,k+1,step+1);
} int main()
{
//freopen("F:\\rush.txt","r",stdin);
two[0] = 1;
rep1(i,1,31)
two[i] = two[i-1]*2;
rei(n);
rep1(i,1,n) rei(a[i]);
rep1(i,1,n)
{
if (a[i+1]==a[i]+1)
top[i][0] = i+1;
else
top[i][0] = i;
rep1(j,1,31)
{
LL ma = a[i]+two[j];
int k;
for (k = top[i][j-1];k <= n;k++)
if (ma<a[k])
break;
top[i][j] = k-1;
}
}
memset(f,0x3f3f3f3f,sizeof f);
dfs(1,0,0);
if (f[n][0]<0x3f3f3f3f)
printf("%d\n",f[n][0]);
else
puts("-1");
return 0;
}

【t092】迷之阶梯的更多相关文章

  1. P1929 迷之阶梯

    题目描述 在经过地球防卫小队的数学家连续多日的工作后,外星人发的密码终于得以破解.它 告诉我们在地球某一处的古老遗迹中,存在有对抗这次灾难的秘密武器.防卫小队立即赶 到这处遗迹.要进入遗迹,需要通过一 ...

  2. 洛谷P1929 迷之阶梯

    P1929 迷之阶梯 题目描述 在经过地球防卫小队的数学家连续多日的工作后,外星人发的密码终于得以破解.它 告诉我们在地球某一处的古老遗迹中,存在有对抗这次灾难的秘密武器.防卫小队立即赶 到这处遗迹. ...

  3. 洛谷 P1929 迷之阶梯

    题目传送门 解题思路: f[i]表示跳到第i层的最少移动次数,如果可以从下面一级跳上来,那么直接跳上来,如果跳不上来,那就往后退,退到不能退或能跳上第i层 AC代码: #include<iost ...

  4. CONTEST36 小Z的模拟赛(2)

    A.小Z的可恶路障 题目:http://www.luogu.org/problem/show?pid=U126 题解:暴力也可以过吧.我为了保险先求了一次最短路,然后枚举这条最短路上的所有边... 代 ...

  5. Java中文字符处理的四大迷题

    虽然计算机对英文字符的支持非常不错,我们也恨不得写的程序只会处理英文的数据,但是昨为中国人,无可避免地要处理一些中文字符.当很简单的一件事情,遇到了中文,一切就不同了!本文就会讲述实际生产环境中遇到的 ...

  6. [LeetCode] Word Ladder 词语阶梯

    Given two words (beginWord and endWord), and a dictionary, find the length of shortest transformatio ...

  7. 你知道 Twitter,但你可能不知道它的 “成长模式” 和 “参与阶梯”

    当你为产品创建 “成长模式” 时,你需要回答以下关键问题(类Twitter产品:http://www.jinhusns.com/Products/Download/?type=xcj ): 目标:产品 ...

  8. [No00002E]关于大数据,你不知道的6个迷思

    还是那个观点:计算机,编程语言,互联网,大数据等等都只是工具! 导语:看过美剧<纸牌屋>没?知道这部"白宫甄嬛传"为什么会火吗?靠的是大!数!据! 过去两年,在 Net ...

  9. 迷之this?(转)

    1. 迷之this 对于刚开始进行 JavaScript 编程的开发者来说,this 具有强大的魔力,它像谜团一样需要工程师们花大量的精力去真正理解它. 在后端的一些编程语言中,例如 Java.PHP ...

随机推荐

  1. 【JZOJ3875】【NOIP2014八校联考第4场第2试10.20】星球联盟(alliance)

    fg 在遥远的S星系中一共有N个星球,编号为1-N.其中的一些星球决定组成联盟,以方便相互间的交流. 但是,组成联盟的首要条件就是交通条件.初始时,在这N个星球间有M条太空隧道.每条太空隧道连接两个星 ...

  2. hdu3917 最大权闭合图

    题意:有N个城市,M个公司.现在需要建立交通是获得的利益最大.如果2个公司A,B, A修的路为Xa->Ya,B的路为Xb->Yb,如果Ya==Xb,那么这2个公司有关系. 对于每个公司都有 ...

  3. 外贸电子商务网站之Prestashop 安装后台中文语言包

    1.先进入到后台,我们进入Localization-> Localization2, 在下面的国家列表中,我们选择china ,导入即可. 3.进入Localization-> Trans ...

  4. More Effective C++: 04效率

    16:牢记80-20准则 80-20准则说的是大约20%的代码使用了80%的程序资源:大约20%的代码耗用了大约80%的运行时间:大约20%的代码使用了80%的内存:大约20%的代码执行80%的磁盘访 ...

  5. php7 新内容

    1.use增强 以thinkphp5.0为例 namespace app\home\controller;use think\{Loader,Controller,Captcha,Request}; ...

  6. SDUT-2804_数据结构实验之二叉树八:(中序后序)求二叉树的深度

    数据结构实验之二叉树八:(中序后序)求二叉树的深度 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 已知一颗二叉树的中序 ...

  7. UIView 判断是否visible

    if(self.view == [(MyAppDelegate *)[[UIApplication sharedApplication] delegate].window.subviews objec ...

  8. .Net Core,VUE,VS Code,Sql Sugar,Element UI学习笔记

    1..Net Core的目的是跨平台,并主要目标是作为服务端开发使用.从3.0开始,引入了Winfrom和WPF. 2..Net Core可以引用.Net Framework生成的dll和exe,不限 ...

  9. JavaScriptBreak 语句 continue 语句

    break 语句用于跳出循环. continue 用于跳过循环中的一个迭代. Break 语句 我们已经在本教程之前的章节中见到过 break 语句.它用于跳出 switch() 语句. break ...

  10. Python中的TCP三次握手和四次挥手过程

    tcp三次握手和四次挥手 首先先介绍什么是传输层: 1.三次握手 1) 三次握手的详述 首先Client(客户)端发送连接请求报文,Server(服务器)段接受连接后回复ACK报文,并为这次连接分配资 ...