DP28. 跳跃游戏(三)
描述
输入描述
输出描述
输出最少跳几次到最后一个位置示例1
输入:
7 2 1 3 3 0 0 100
输出:
3
说明:
示例2
输入:
7 2 1 3 2 0 0 100
输出:
-1
C++ 解法, 执行用时: 12ms, 内存消耗: 1164KB, 提交时间: 2022-04-22
#include<iostream>using namespace std;const int MAXN = 1e5+5;int n;int arr[MAXN];int step[MAXN];int main(){ios::sync_with_stdio(false);cin >> n;for(int i = 0; i < n; ++i)cin >> arr[i];int curMax = arr[0];//记录最大可达step[0] = 0;//初始化for(int i = 0; i < n && i < arr[0]; ++i)step[1+i] = 1;for(int i = 1; curMax < n-1 && i <= curMax; ++i){//从后往前更新,保证步数最小for(int k = (i + arr[i]) >= n ? n-1 : i+arr[i]; !step[k]; --k)step[k] = step[i]+1;curMax = max(curMax, i+arr[i]);}if(curMax >= n-1)cout << step[n-1];else cout << -1;return 0;}
C++ 解法, 执行用时: 13ms, 内存消耗: 804KB, 提交时间: 2022-02-17
#include <bits/stdc++.h>#define rep(i,a,b) for(int i = (a); i < (b); ++i)#define ms(a,b) memset(a,b,sizeof(a))using namespace std;typedef pair<int,int> P;const int MAXN = 2e5 + 10;const int INF = 2e9;int a[MAXN];int dp[MAXN] = {0};int main(){ios::sync_with_stdio(0);int n;cin >> n;rep(i,0,n) cin >> a[i];if(!n){cout << -1 << endl;return 0;}int ans = 0, maxpos = 0, end = 0;rep(i,0,n){if(i <= maxpos){maxpos = max(maxpos,i+a[i]);if(i == end){end = maxpos;if(i!=n-1)ans++;}}else {ans = -1;break;}}cout << ans << endl;return 0;}
C++ 解法, 执行用时: 13ms, 内存消耗: 1180KB, 提交时间: 2022-05-07
#include <bits/stdc++.h>using namespace std;int main(){int n;scanf("%d",&n);if(n==0) printf("-1");else{int nums[100005];for(int i=0;i<n;++i){scanf("%d",&nums[i]);}int dp[100005];dp[0]=1;int start =0,len = nums[0];for(int i=1;i<n;++i){if(i<=start+len){dp[i] = dp[start]+1;}else{int start1=start,len1 = len;for(int j=start;j<=len+start;++j){if(j+nums[j]>start1+len1){start1 = j,len1 = nums[j];}}start = start1,len = len1;if(i<=start +len) dp[i] = dp[start]+1;else dp[i]=0;}}printf("%d",(dp[n-1]==0?-1:dp[n-1]-1));}}
C 解法, 执行用时: 14ms, 内存消耗: 680KB, 提交时间: 2022-02-17
#include <stdio.h>int max(int a,int b){return a>b?a:b;}int min(int a,int b){return a<b?a:b;}int main() {long long n,i,j,maxnum=0;int sub=0,nub=0;int arr[100001]={0};int dp[100001]={0};scanf("%d",&n);for(i = 0;i<n;i++){scanf("%d",&arr[i]);}dp[0] = 0;for(i = 0 ;i < n;i++){if(maxnum < i ){sub = -1;break;}maxnum = max(maxnum,arr[i]+i);if(i == nub){nub = max(nub,maxnum);if(i < n-1) sub++;}/*for(j = i-1; j >= 0 ;j-- ){if(arr[j]+j >= i){nub = j;}}if(i > 0)dp[i] = min(dp[nub]+1,dp[i-1]+1);*/}printf("%d",sub);return 0;}
C++ 解法, 执行用时: 14ms, 内存消耗: 1228KB, 提交时间: 2022-07-21
#include <bits/stdc++.h> // C++万能头文件using namespace std;static const auto io_sync_off = [](){ // lambda表达式std::ios::sync_with_stdio(false); // 解除与scanf()等函数的同步std::cin.tie(nullptr); // 解除cin和cout的绑定return nullptr;}();int main() {int n;cin >> n;if (n == 0) {cout << "-1\n";return 0;}int nums[n];for (int i = 0; i < n; ++i)cin >> nums[i];int maxi = 0, j = 0, steps = 0;for (int i = 0; i <= j; ++i) { // 当前可达jif (j >= n - 1) { // 当前可达末尾cout << steps << "\n";return 0;}maxi = max(maxi, i + nums[i]);if (i == j) {j = maxi; // 更新下一跳为当前最远位置++steps;}}cout << "-1\n";return 0;}