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個骰子的狀態有關。可以一步步劃分來求,一般考慮設個數祖,乙個記錄當前是第多少個骰子,乙個記錄總和多少,還要記錄總和的概率,因此此處考慮設個二維陣列...