nyoj 1182旅遊 三進製狀態壓縮dp

2021-07-03 15:30:02 字數 1785 閱讀 3405

這個是經典狀態壓縮dp tsp問題的變形

首先來看看《挑戰程式設計競賽》講解tsp問題:

給定乙個n個定頂點組成的帶權有向圖的距離矩陣d(i,j)(inf表示沒有變)。要求從頂點0出發,經過每個頂點恰好一次後再回到頂點0。問所經過得邊的總權重的最小值是多少?

限制條件 1

0tsp問題是np困難的。沒有已知的的多項式時間的高效演算法可以解決這一問題。

所有可能的路線共有(n-1)!種。這是個非常大的值。即使在本題中n已經很小了。仍然無法試遍每一種情況。對於這個問題我們可以使用dp來解決。首先讓我們試著寫出它的遞推式。

假設現在已經訪問過得頂點的集合(起點0當做還未訪問過的頂點)為s.當前所在頂點為v,用dp[s][v]表示從v出發訪問剩餘的所有頂點。最終回到頂點0的路徑的權重總和的最小值。由於從v出發可以移動到任意乙個節點u不屬於s,因此有如下遞推式:

dp[v][0]=0;

dp[s][v]=min][u]+d(v,u)|u不屬於s};

我只要按照這個遞推式進行計算就可以了。這樣就可以在o(2^n*n^2)的時間裡完成計算。

時間限制:

1000 ms  |  記憶體限制:

65535 kb

難度:4 描述

有n個城市,乙個人去旅遊,他想遊遍n個城市,且每個城市最多去兩次,問最短的路程是多少。

起點任意,每兩個城市之間可能會有多條路,也可能會沒有路。如果能遊遍所有的城市

輸出最少的,不能的話輸出-1

輸入有多組測試資料,每組都有乙個正整數n和m(n>1&&n<=10,m>0)

n表示由n個城市,接下來有m行,每行三個正整數,u,v,w表示

u和v之間有一條長為w的路(w>=0&&w<300)。

輸出每組資料輸出一行,如果能遊遍所有的城市,輸出最短的距離,如果不能,輸出-1

樣例輸入

樣例輸入

這道題與經典tsp問題用的是同一種dp遞推式。區別是:(1)不需要迴路(2)頂點限制的次數+1

經典tsp問題它要求頂點只能遍歷一次,所以對於dp的狀態,記錄的是該頂點的入度。而在這道題裡入度的要求則變成了indegree小於等於2.所以問題就從經典tsp的二進位制的狀態壓縮變成了三進製的狀態壓縮.

對於三進製的狀態轉移因為不能用位運算了,所以就要對三進製的操作進行預處理並用陣列儲存。

#include #include #include #define max_v 12

#define inf 0x3f3f3f3f

int n,m;

int g[max_v][max_v];

int ter[60000][max_v];//ter[s][v]表示在s狀態中v頂點的入度

int bit=;

int dp[60000][max_v];

int findmin(int x,int y)

void ternary_init()

int ans=inf;

for(int s=0;s=2)

continue;

dp[s+bit[v]][v]=findmin(dp[s+bit[v]][v],dp[s][u]+g[u][v]);//狀態轉移}}

if(flag)

{//所有頂點的入度都大於0

for(u=0;u

1182 合影效果

時間限制 1000 ms 記憶體限制 65536 kb 提交數 2035 通過數 1172 小雲和朋友們去爬香山,為美麗的景色所陶醉,想合影留念。如果他們站成一排,男生全部在左 從拍照者的角度 並按照從矮到高的順序從左到右排,女生全部在右,並按照從高到矮的順序從左到右排,請問他們合影的效果是什麼樣的...

1182 合影效果

題目描述 小雲和朋友們去爬香山,為美麗的景色所陶醉,想合影留念。如果他們站成一排,男生全部在左 從拍照者的角度 並按照從矮到高的順序從左到右排,女生全部在右,並按照從高到矮的順序從左到右排,請問他們合影的效果是什麼樣的 所有人的身高都不同 輸入 第一行是人數n 2 n 40,且至少有1個男生和1個女...

1182 統計單詞

題目描述 編乙個程式,讀入使用者輸入的,以 結尾的一行文字,統計一共有多少個單詞,並分別輸出每個單詞含有多少個字元。凡是以乙個或多個空格隔開的部分就為乙個單詞 輸入 輸入包括1行字串,以 結束,字串中包含多個單詞,單詞之間以乙個或多個空格隔開。輸出 可能有多組測試資料,對於每組資料,輸出字串中每個單...