各種面試題 N個點來回路徑最小

2021-06-18 16:18:55 字數 1205 閱讀 2861

n個點來回路徑最小:

2023年hulu面試中出現過。

二維平面上有n個點,已按照x座標從左到右排序(所有點的x座標均不同),存放在陣列points中。

需要從最左邊的點出發,先向右掃瞄訪問一些點,到達最右邊的點,然後再向左掃瞄,訪問第一次沒有訪問的點,最後回到最左邊的點。掃瞄過程中經過的總的歐式距離要最小。返回這個最小的歐式距離。

樣例:

points (x,y) : [(0, 0), (30, 40), (31, 0)]

最優路徑為 (0, 0) -> (31, 0) -> (30,40) -> (0, 0),總的距離為121.012,因此函式應返回121.012。

這個題跟之前兩條路徑求最大收穫的題一樣的,也是從起始點同時發兩條路徑出去,然後計算這個距離。

記 cost [i] [j] 表示 從起始點出發 第一條路徑停在 i 點,第二條路徑停在 j 點時候的距離總和。

注意我們總是討論 i 在 j 點後邊的情況,即 i 點離起點遠。 當  i < j 的時候  cost [i][j] = cost [j] [i] 

所以我們這麼看,當我們計算 cost [ i ] [ j ]  的時候,如果 i , j 中間有其他點, 那麼這些點肯定是屬於 i 這條路徑的,因為本來 i 跟 j 就分別表示兩條路徑到達的最遠點。

所以 (i ,j ) 這個狀態肯定來自與 (i-1 ,j ) ,所以  cost = cost[ i-1] [ j ] + dist ( i-1, i )

如果i 和j 挨著的,那麼 i 可以來自於前面的每個點 ,所以要列舉這個k ,然後取最小值。

注意我只計算 i > j 的情況,另外一半沒有算,所以列舉 k

#include#include#include#includeusing namespace std;

struct point ;

double dist(vector& points,int i,int j)

double mindist(vector&points)

else

}cost[i][j]=mincost;

} }return cost[n-1][n-1];

}int main()

double dis= mindist(points);

cout << dis <

面試題六十 n個骰子的點數

把n個骰子扔在地上,求出現和為s的概率 可得n s 6n 方法 定義6n n 1長度的陣列,然後對所有可能出現的組合進行計算,把結果進行計數存進陣列 遞迴 方法二 動態規劃,大問題小化 考慮使用兩個陣列儲存點子的總數之和出現的次數,每增乙個骰子,是前幾個陣列值的和,因為6個面,所以前n的前6的和 v...

面試題43 n個骰子的點數

注意點 n 個骰子的面朝上點數和的範圍 n,6n 一共有6n n 1種可能 每個骰子的範圍 1,6 n 個骰子分為兩部分,第一骰子和其餘的n 1個骰子 遞迴的終止條件為當前其餘骰子個數為0個 include include include includeusing namespace std int...

面試題43 n個骰子的點數

題目 把n個骰子扔在地上,所有骰子朝上一面的點數之和為s。輸入n,列印出s所有可能的值出現的概率。該題是典型的動態規劃問題。n個骰子它的和顯然和前面n 1個骰子的狀態有關。可以一步步劃分來求,一般考慮設個數祖,乙個記錄當前是第多少個骰子,乙個記錄總和多少,還要記錄總和的概率,因此此處考慮設個二維陣列...