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. Apache Camel 与 Spring Boot 集成,通过FTP定时采集、处理文件 (转)

    1.概要: 本项目主要是通过在Spring平台上配置Camel.FTP,实现定时从FTP服务器下载文件到本地.解析文件.存入数据库等功能. 2.搭建空项目: Spring Boot有几种自动生成空项目 ...

  2. VBA 生成带时间戳的随机数字

    Function GenPasswd(length, level) Dim allstr, substr, passwd As String allstr = "0123456789abcd ...

  3. 通过DataWorks数据集成归档日志服务数据至MaxCompute进行离线分析

    通过DataWorks归档日志服务数据至MaxCompute 官方指导文档:https://help.aliyun.com/document_detail/68322.html但是会遇到大家在分区上或 ...

  4. Selenium-----wait的三种等待

    在UI自动化测试中,必然会遇到环境不稳定,网络慢的情况,这时如果你不做任何处理的话,代码会由于没有找到元素,而报错.这时我们就要用到wait(等待),而在Selenium中,我们可以用到一共三种等待, ...

  5. 【AtCoder Regular Contest 092】C.2D Plane 2N Points【匈牙利算法】

    C.2D Plane 2N Points 题意:给定N个红点二维坐标N个蓝点二维坐标,如果红点横纵坐标都比蓝点小,那么它们能够构成一组.问最多能构成多少组. 题解:把满足要求的红蓝点连线,然后就是匈牙 ...

  6. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十一章:模板测试

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十一章:模板测试 代码工程地址: https://github.co ...

  7. 【Leetcode链表】环形链表(141)

    题目 给定一个链表,判断链表中是否有环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos 是 -1,则在该链表中没有环. 示例 1: ...

  8. 给图片加ALT属性是个什么意思?有什么优点呢

    使用百度统计的seo建议当中一条图片ALT信息"存在没有alt信息的img标签"扣分较多.站点图片中加入ALT对seo有什么优点呢?这是非常多初学seo的朋友们都须要询问的问题.a ...

  9. C#判断文件是否被混淆

    可以使用混淆工具对一个DLL 和 exe 进行混淆. 但是如何知道一个文件是否已经混淆了. 在发布之前,需要知道是不是有文件忘了混淆. 要判断文件是否混淆,必须知道常用的混淆手法. 混淆就是因为编写的 ...

  10. oralce GROUPING SETS

    select id,area,stu_type,sum(score) score from students group by grouping sets((id,area,stu_type),(id ...