題目:輸入數組,數組元素表示該處可跳躍的最大長度,求是否可以從第一個元素到達最後一個元素,若可到達最求出最少的跳躍次數
分析:判斷是否可跳到最後,dp[i]=max(dp[i-1],i+arr[i]) (i<dp[i-1])注:dp[i]表示第一個元素通過前i個元素跳躍的最大長度
判斷最少跳躍次數,dp[i]=min(dp[j]+1,dp[i]) (i<j<=i+arr[i]) 注:dp[i]表示第i個元素到最後元素跳躍的最少次數
說明:從第一個元素[0]跳躍到最後一個元素[n-1],跳躍長度>=n-1,而非n
/*跳躍遊戲-是否可跳躍到最後一個元素*/
#include <iostream>
using namespace std;
int arr[502],n;
int canjump()
{
int global=0,local=0;
for(int i=0;i<n;i++)
{
if(global<i) return 0;
global=max(global,i+arr[i]);
}
if(global>=n-1) return 1;
else return 0;
}
int main()
{
while(cin>>n)
{
for(int i=0;i<n;i++)
cin>>arr[i];
if(canjump()==1) cout<<"true";
else cout<<"false";
}
}
/*跳躍遊戲二-求跳躍到最末元素最少的次數*/
#include <iostream>
using namespace std;
int n,arr[502],dp[502];
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>arr[i];
dp[i]=0xFFFF;
}
dp[n-1]=0;
for(int i=n-2;i>=0;i--)
{
int k=i+arr[i];
for(int j=i+1;j<=k&&j<n;j++)
{
dp[i]=min(dp[i],dp[j]+1);
}
}
cout<<dp[0]<<endl;
}