動態規劃 TSP問題 最短超級串

2022-08-11 08:27:12 字數 1813 閱讀 1038

2020-03-03 22:55:08

問題描述:

給定乙個字串陣列 a,找到以 a 中每個字串作為子字串的最短字串。

我們可以假設 a 中沒有字串是 a 中另乙個字串的子字串。

示例 1:

輸入:["alex","loves","leetcode"]

輸出:"alexlovesleetcode"

解釋:"alex","loves","leetcode" 的所有排列都會被接受。

示例 2:

輸入:["catg","ctaagt","gcta","ttca","atgcatc"]

輸出:"gctaagttcatgcatc"

1 <= a.length <= 12

1 <= a[i].length <= 20

問題求解:

解法一:暴力求解

首先我們要明確的就是,本題可以轉化成圖論的題目,就是在乙個圖中要遍歷所有的節點一次,最後路徑的最小值是多少。(這裡和tsp略有不同,即我們不需要返回起始節點)

暴力求解,可以理解為全排列,只不過我們做了一些剪枝操作進行了加速。

時間複雜度:o(n!)

int res = (int)1e9;

listpath;

int n;

public string shortestsuperstring(string a) }}

}helper(a, graph, 0, 0, 0, new arraylist<>());

stringbuffer sb = new stringbuffer();

for (int i = 0; i < n; i++)

return sb.tostring();

}private void helper(string a, int graph, int k, int used, int curr, listcurr_p)

for (int i = 0; i < n; i++)

}

解法二:dp

dp[s][i] : 當前訪問過的節點狀態為s,且以i為結尾的最短路徑。

init :

dp[1 << i][i] = a[i].length()

transition :

對於dp[s][i]我們需要去列舉所有的parent節點,計算得到當前的最小值。

dp[s][i] = min}}

}int dp = new int[1 << n][n];

int parent = new int[1 << n][n];

for (int i = 0; i < 1 << n; i++)

for (int i = 0; i < n; i++) dp[1 << i][i] = a[i].length();

for (int s = 1; s < 1 << n; s++) }}

}int curr = -1;

int min = (int)1e9;

for (int i = 0; i < n; i++)

}int s = (1 << n) - 1;

string res = "";

while (s > 0)

return res;

}

TSP問題 動態規劃實現

貨郎擔問題 tsp 有n個城市,兩兩之間均有路直接連線,求一條經過每個城市一次且僅一次,最後返回起點的最短路線。這是劉汝佳書上的一道題,他給出了思路,我實現了一下。用動態規劃解決,可以假設從0點出發,然後回到0點。那麼用 f i,s 表示現在處在i點,要去訪問剩餘的在集合s中的點,集合s可以用二進位...

動態規劃解決TSP問題

題目描述 某推銷員要從城市 v1 出發,訪問其它城市v2,v3,v6 各一次且僅一次,最後返回v1。d為各城市間的距離矩陣。問 該推銷員應如何選擇路線,才能使總的行程最短?int d node number node number 每個點之間距離的矩陣 int path 6 6 行表示走到第幾步,列...

TSP問題,動態規劃法

tsp問題是指旅行家要旅行n個城市,要求各個城市經歷且僅經歷一次然後回到出發城市,並要求所走的路程最短。各個城市間的距離可以用代價矩陣來表示。假設從頂點i出發,令d i,v 表示從頂點i出發經過v 中各個頂點一次且僅一次,最後回到出發點i的最短路徑長度,開始時,v v 於是,tsp問題的動態規劃函式...