1. 程式人生 > >2017校招線上程式設計題——最快到達陣列末端

2017校招線上程式設計題——最快到達陣列末端

文章目錄

問題描述

\qquad給定一個數組,裡面全是正整數。數字大小表示這一步最多可以向後移動幾個節點。總是從陣列第一個元素開始移動。問如何移動,可以以最少步數移動到最後一個節點。

例如:[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

問題分析

  1. 這也是一道動規題,可以在o(n^2)的時間複雜度,o(n)的空間複雜度下完成
  2. 想了解更詳細的動態規劃的一般解法,可以參照這題

程式碼實現

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; }