1. 程式人生 > >袋鼠過河(C++)

袋鼠過河(C++)

目錄

問題描述:

輸入描述:

輸出描述:

例如:

輸入: 5 2 0 1 1 1 

輸出: 4 

思路解析: 


問題描述:

         一隻袋鼠要從河這邊跳到河對岸,河很寬,但是河中間打了很多樁子,每隔一米就有一個,每個樁子上都有一個彈簧,袋鼠跳到彈簧上就可以跳的更遠。每個彈簧力量不同,用一個數字代表它的力量,如果彈簧力量為5,就代表袋鼠下一跳最多能夠跳5米,如果為0,就會陷進去無法繼續跳躍。河流一共N米寬,袋鼠初始位置就在第一個彈簧上面,要跳到最後一個彈簧之後就算過河了,給定每個彈簧的力量,求袋鼠最少需要多少跳能夠到達對岸。如果無法到達輸出-1 。

輸入描述:

輸入分兩行,第一行是陣列長度N (1 ≤ N ≤ 10000),第二行是每一項的值,用空格分隔。

輸出描述:

輸出最少的跳數,無法到達輸出-1

例如:

輸入: 

2 0 1 1 1 


輸出: 


思路解析: 

這個問題據說是經典的動態規劃問題,參考了網上很多描述,下面是自己對於該問題的理解。 
首先,設彈簧陣列為a[   ],跳越次數dp[   ];
問題分解:要求最少需要多少跳,那麼我們把問題分解:


如果河寬為0米,最少需要dp[0]跳,可知dp[0]=0; 


如果河寬1米,最少需要dp[1]跳,那麼如果在起始的位置直接跳0+a[0]>=1,那麼就可以跳過去;如果在之前的一跳基礎上進行跳下次則為dp[1]=dp[0]+1;


如果河寬2米,最少需要dp[2]跳,具體有兩種方法:一是從0開始跳(0+a[0]>=2即可),二是從1開始跳(1+a[1]>=2即可),那麼從0開始跳,dp[2]=dp[0]+1;從1開始跳,dp[2]=dp[1]+1。然後比較哪個dp[2]的值更小,則取之。 

以此類推

下面是C++程式:

#include<stdio.h>
#include<algorithm>
using namespace std;
int a[10005],dp[10005];
const int MAX=99999999;
int main(){
    int N,i,j;
    while(scanf("%d",&N)!=EOF){
        for(i=0;i<10005;i++) dp[i]=MAX;
        dp[0]=0;
        for(i=0;i<N;i++) scanf("%d",&a[i]);
        int step[10005];
        for(i=1;i<=N;i++)
            for(j=0;j<i;j++)
                if(a[j]+j>=i)
                    dp[i]=min(dp[i],dp[j]+1);
        printf("%d\n",dp[N]==MAX?-1:dp[N]);
    }
}