新飞行棋——动态规划

简介: 题目描述期末考试终于结束了。Andy同学感觉松了一口气,他决定重温小时候的快乐时光–下飞行棋。但是他弄丢了传统飞行棋需要的骰子,因此他发明了一种新型的飞行棋游戏,规则如下:棋盘上有n个格子,由近到远分别编号为1到n。对于1<=i<=n,第i个格子上写着一个正整数Ni。当玩家处于第a个格子时,他可以选择往后走Na步,或者往前倒退Na步。当然如果Na+a>n,那么他就只能选择后退;同理如果a-Na<1,那么他就只能选择前进。保证不会出现既不能前进又不能后退的格子。Andy学完编程后对一个问题很感兴趣:从编号s出发,至少需要经过几把,可以到达t点?(例如在a点选择往前走Na步,称之为一把)。

题目描述


期末考试终于结束了。Andy同学感觉松了一口气,他决定重温小时候的快乐时光–下飞行棋。

但是他弄丢了传统飞行棋需要的骰子,因此他发明了一种新型的飞行棋游戏,规则如下:棋盘上有n个格子,由近到远分别编号为1到n。对于1<=i<=n,第i个格子上写着一个正整数Ni。当玩家处于第a个格子时,他可以选择往后走Na步,或者往前倒退Na步。当然如果Na+a>n,那么他就只能选择后退;同理如果a-Na<1,那么他就只能选择前进。保证不会出现既不能前进又不能后退的格子。

Andy学完编程后对一个问题很感兴趣:从编号s出发,至少需要经过几把,可以到达t点?(例如在a点选择往前走Na步,称之为一把)。


输入


第一行三个整数,分别为n,s,t意义如题面所述。

第二行n个正整数,第i个数为Ni。


输出


一个数,为最少经过的把数。如果s无法到达t,输出-1。


样例输入 Copy


6 6 4
1 2 2 3 1 2


样例输出 Copy


1


提示


对于前10%的数据,s=t;

对于前40%的数据,n<=200;

对于另外10%的数据,s无法到达t;

对于100%的数据,n<=200000;


#pragma GCC optimize("Ofast,unroll-loops,no-stack-protector,fast-math")
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#pragma comment(linker, "/stack:200000000")
#pragma GCC optimize (2)
#pragma G++ optimize (2)
#include <bits/stdc++.h>
#include <algorithm>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
using namespace std;
#define wuyt main
typedef long long ll;
#define HEAP(...) priority_queue<__VA_ARGS__ >
#define heap(...) priority_queue<__VA_ARGS__,vector<__VA_ARGS__ >,greater<__VA_ARGS__ > >
template<class T> inline T min(T &x,const T &y){return x>y?y:x;}
template<class T> inline T max(T &x,const T &y){return x<y?y:x;}
ll read(){ll c = getchar(),Nig = 1,x = 0;while(!isdigit(c) && c!='-')c = getchar();
if(c == '-')Nig = -1,c = getchar();
while(isdigit(c))x = ((x<<1) + (x<<3)) + (c^'0'),c = getchar();
return Nig*x;}
#define read read()
const ll inf = 1e15;
const int maxn = 1e6 + 7;
const int mod = 1e9 + 7;
///ll n,m,k,x;
/**
ll superpow(ll a,ll b){
    ll ans=1;
    while (a>0)
    {
        if (a%2) ans=ans*b%n;
        b=b%n*b%n;
        a/=2;
    }
    return ans;
}
ll n,x;**/
ll num[maxn];
ll dp[maxn];
int main(){
    ll n=read,s=read,t=read;
    for(int i=1;i<=n;i++) num[i]=read;
    dp[s]=1;int flg=1;
    while(flg){
        flg=0;
        for(int i=1;i<=n;i++){
            if(dp[i]){
                if(i-num[i]>=1)///back
                {
                    if(dp[i-num[i]]==0||dp[i-num[i]]-1>dp[i]){
                        flg=1;
                        dp[i-num[i]]=dp[i]+1;
                    }
                }
                /**
                向后走的情况,后面的一种的方法数量等于在前面那一步的方法数加一
                有办法走,就将flg->1;
                **/
                if(i+num[i]<=n)///front
                {
                    if(dp[i+num[i]]==0||dp[i+num[i]]>dp[i]+1){
                        dp[i+num[i]]=dp[i]+1;
                        flg=1;
                    }
                }
                /**
                向前走的情况,前面的一种方法数量等于后面的方法数量加上1
                在这种情况下,就需要将flg->1
                **/
            }
        }
    }
    printf("%lld\n",dp[t]-1);
    return 0;
}

思路来自同学:https://me.csdn.net/weixin_45675097


文章知识点与官方知识档案匹配,可进一步学习相关知识

算法技能树leetcode-动态规划22-括号生成6831 人正在系统学习中

目录
相关文章
|
JavaScript
electron中使用ws
electron中使用ws
|
数据采集 安全 Go
Go并发优化的9大技巧,效果立竿见影
Go并发优化的9大技巧,效果立竿见影
895 0
|
JavaScript 前端开发 网络安全
Video.js实现在html页面播放rtmp流媒体
Video.js实现在html页面播放rtmp流媒体
1855 0
|
11月前
|
存储 JSON 数据库
鸿蒙元服务项目实战:备忘录内容编辑开发
富文本内容编辑我们直接使用RichEditor组件即可,最重要的就是参数,value: RichEditorOptions,通过它,我们可以用来设置样式,和获取最后的富文本内容,这一点是很重要的。
304 5
鸿蒙元服务项目实战:备忘录内容编辑开发
|
机器学习/深度学习 人工智能 自然语言处理
软件测试的未来趋势:AI与自动化的融合
随着技术的不断进步,软件测试领域正迎来一场革命。本文将探讨人工智能(AI)和自动化技术如何共同推动软件测试的发展,提高测试效率,减少人为错误,并预测未来的发展趋势。通过分析当前市场上流行的测试工具和方法,以及它们如何整合AI和自动化技术,我们将揭示这一领域即将迎来的变革。
541 29
|
SQL Shell 数据库连接
死磕xxl-job(二)
死磕xxl-job(二)
|
12月前
|
算法 人机交互 UED
响应时间指标的探索
本文探讨了响应时间在人机交互中的重要性及发展。从1968年Rober B.Miller首次定义响应时间的多个维度,到1991年Stuart K.Card等人提出的立即响应时间常数,再到1993年Jakob Nielsen将响应时间划分为三个关键阈值,直至2020年Google提出的RAIL模型,强调了以用户为中心的性能衡量标准。这些研究为提升用户体验提供了理论基础和技术指导。
977 5
|
消息中间件 存储 NoSQL
剖析 Redis List 消息队列的三种消费线程模型
Redis 列表(List)是一种简单的字符串列表,它的底层实现是一个双向链表。 生产环境,很多公司都将 Redis 列表应用于轻量级消息队列 。这篇文章,我们聊聊如何使用 List 命令实现消息队列的功能以及剖析消费者线程模型 。
剖析 Redis List 消息队列的三种消费线程模型
|
存储 算法 开发工具
git文件夹内容详解
git文件夹内容详解
916 1
|
SQL 数据库 数据安全/隐私保护
harbor修改密码
在Harbor `v2.9.0`中,忘记密码可使用以下方法强制重置:通过`docker exec`进入harbor-db容器,使用SQL命令`update harbor_user set salt=&#39;&#39;,password=&#39;&#39; where user_id = 1;`清空admin密码。然后重启Harbor,系统将要求初始化新密码。注意此操作涉及数据库交互,需谨慎执行。
1533 0