跳跃游戏-计蒜课

来源:互联网 发布:战千雄源码 编辑:程序博客网 时间:2024/05/17 09:30

题目:输入数组,数组元素表示该处可跳跃的最大长度,求是否可以从第一个元素到达最后一个元素,若可到达最求出最少的跳跃次数


分析:判断是否可跳到最后,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;}


    

0 0
原创粉丝点击