2017校招線上程式設計題——最快到達陣列末端
阿新 • • 發佈:2018-12-30
文章目錄
問題描述
給定一個數組,裡面全是正整數。數字大小表示這一步最多可以向後移動幾個節點。總是從陣列第一個元素開始移動。問如何移動,可以以最少步數移動到最後一個節點。
例如:[3,4,2,1,3,1]初始狀態指向3表示下一步可以移動1格,或者2格,或者3格。
最優的方式是指向3的時候移動一步,第二次選擇移動4步,一共只需要兩步即可移動到陣列尾。
-
輸入
第一個數字為 陣列長長度,後面緊跟n個數字,例如3,4,2,1,3,1
-
輸出
輸出最短路徑長度及最短路徑,如3 3,4,1
樣例輸入輸出
- 輸入
-
6 3 4 2 1 3 1
- 輸出
-
3,4,1
問題分析
- 這也是一道動規題,可以在o(n^2)的時間複雜度,o(n)的空間複雜度下完成
- 想了解更詳細的動態規劃的一般解法,可以參照這題
程式碼實現
IDE : vs code
編譯器:MinGW
語言 :C++
#include <iostream>
#define inf 10000000
using namespace std;
int solve(int* a,int* b,int* path,int n)
{
b[0] = 1;
for(int i = 1;i < n;i ++){
for(int j = 0 ;j < i;j ++){
if(i - j <= a[j] && b[i] > b[j] + 1){
b[i] = b[j] + 1;
path[i] = j;
}
}
}
return b[n-1];
}
int main()
{
int n;
int a[10000],b[10000],path[10000],res[10000];
while(cin >> n && n){
for (int i = 0;i < n;i ++) {
cin >> a[i];
b[i] = inf;
path[i] = 0;res[i] = 0;
}
cout << solve(a,b,path,n) << " ";
int i = n -1,j = 0;
while(i != 0){
res[j++] = i;
i = path[i];
}
cout << a[0] ;
for(i = j -1;i >= 0;i --) cout << "," << a[res[i]];
}
return 0;
}