Contents
Problem
Solution
利用二進位存集合,狀態壓縮。(1:要配對的)
從小到大窮舉子集,bottom-up: for (int s = 1; s < (1 << n); s++)
接著從子集中找出要配對的第一個點:
for (i = n - 1; i >= 0; i--)//最前面的元素,也就是要配對的(向右尋找)
if (s&(1 << i))
break;
再從它之後的找一點配對:
for (int j = 0; j < i; j++)//窮舉 i 右邊的元素來配對
if (s&(1 << j))
dp[s] = MIN(dp[s], dis[j][i] + dp[s ^ (1 << i) ^ (1 << j)]);
s ^ (1 << i) ^ (1 << j)
也就是 i
, j
這兩點還未配對時的集合狀態,其 dp[]
就是那時的最短距離。
Code
1 |
|