计蒜客 20 跳跃游戏二
2016-05-12 13:52
232 查看
链接: https://nanti.jisuanke.com/t/20
给定一个非负整数数组,假定你的初始位置为数组第一个下标。
数组中的每个元素代表你在那个位置能够跳跃的最大长度。
你的目标是到达最后一个下标,并且使用最少的跳跃次数。
例如:
A=[2,3,1,1,4],到达最后一个下标的最少跳跃次数为 2。(先跳跃 1 步,从下标 0 到 1,然后跳跃 3 步,到达最后一个下标。一共两次)
第一行输入一个正整数 (1 ≤ n ≤ 100) ,接下来的一行,输入 n 个整数,表示数组 A
最后输出最少的跳跃次数。
DP 问题:
从 a[i] 开始跳跃,我们所能跳跃的下标是:i + j(j表示跳跃的长度: 1 <= j <= a[i]).
就有dp[i+j] = dp[i] + 1; dp[i]表示从开始跳跃到下标i的最小次数.
如果我们需要打印最小跳跃路径的话,可以再开一个数组,记录从哪一个下标跳跃到现在这个下标所需次数是最小的。
跳跃游戏二
关键词:动态规划
Description
给定一个非负整数数组,假定你的初始位置为数组第一个下标。数组中的每个元素代表你在那个位置能够跳跃的最大长度。
你的目标是到达最后一个下标,并且使用最少的跳跃次数。
例如:
A=[2,3,1,1,4],到达最后一个下标的最少跳跃次数为 2。(先跳跃 1 步,从下标 0 到 1,然后跳跃 3 步,到达最后一个下标。一共两次)
Input
第一行输入一个正整数 (1 ≤ n ≤ 100) ,接下来的一行,输入 n 个整数,表示数组 A
Output
最后输出最少的跳跃次数。
SampleInput
5 3 1 1 1 1
SampleOutput
2
Analyze
DP 问题:dp[i+j] = min(dp[i]+1, dp[i+j]);
从 a[i] 开始跳跃,我们所能跳跃的下标是:i + j(j表示跳跃的长度: 1 <= j <= a[i]).
就有dp[i+j] = dp[i] + 1; dp[i]表示从开始跳跃到下标i的最小次数.
如果我们需要打印最小跳跃路径的话,可以再开一个数组,记录从哪一个下标跳跃到现在这个下标所需次数是最小的。
Code
#include <cstdio> #include <cstring> #include <climits> #include <algorithm> using namespace std; int dp[1000], a[1000]; int n; int main() { while(scanf("%d", &n) != EOF) { for(int i=0; i<=1000; i++) dp[i] = INT_MAX-1; for(int i=1; i<=n; i++) scanf("%d", &a[i]); dp[1] = 0; for(int i=1; i<=n; i++) { for(int j=1; j<=a[i]; j++) { dp[i+j] = min(dp[i]+1, dp[i+j]); } } printf("%d\n", dp ); } return 0; }
相关文章推荐
- 基于BootStrap Metronic开发框架经验小结【九】实现Web页面内容的打印预览和保存操作
- python3在用pip装lxml模块遇到的问题
- 正则
- android 微信登录
- 网络流SAP
- Docker部署Rancher Server-centos7
- iOS 常用第三方开源框架介绍
- Codeforces Round #352 (Div. 2) ABCD
- thrift系列 - harpc 基于thrift的轻量级rpc框架
- SpringMVC @ResponseBody 415错误处理
- HDOJ 1007-Quoit Design【模板:多点求最短距离(非整数点)】
- 语法分析(5)...
- 剑指offer之面试题27二叉搜索树与双向链表
- SQL恢复master数据库方法 只有mdf文件的数据库如何恢复
- <context:component-scan>使用说明
- Codeforces Round #352(Div 2)
- 怎么处理Word中的竖箭头
- uml学习
- iOS持续集成:jenkins+gitlab+蒲公英+邮件通知(Part 2)
- spring事务配置详解