袋鼠過河(C++)
阿新 • • 發佈:2018-11-24
目錄
問題描述:
一隻袋鼠要從河這邊跳到河對岸,河很寬,但是河中間打了很多樁子,每隔一米就有一個,每個樁子上都有一個彈簧,袋鼠跳到彈簧上就可以跳的更遠。每個彈簧力量不同,用一個數字代表它的力量,如果彈簧力量為5,就代表袋鼠下一跳最多能夠跳5米,如果為0,就會陷進去無法繼續跳躍。河流一共N米寬,袋鼠初始位置就在第一個彈簧上面,要跳到最後一個彈簧之後就算過河了,給定每個彈簧的力量,求袋鼠最少需要多少跳能夠到達對岸。如果無法到達輸出-1 。
輸入描述:
輸入分兩行,第一行是陣列長度N (1 ≤ N ≤ 10000),第二行是每一項的值,用空格分隔。
輸出描述:
輸出最少的跳數,無法到達輸出-1
例如:
輸入:
5
2 0 1 1 1
輸出:
4
思路解析:
這個問題據說是經典的動態規劃問題,參考了網上很多描述,下面是自己對於該問題的理解。
首先,設彈簧陣列為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]); } }