3311 POJ 狀態壓縮

2021-06-28 19:51:08 字數 1253 閱讀 7899

#include#include#include#include#include#include#include#include#include#include#define ll __int64

#define lll unsigned long long

#define max 1000009

#define eps 1e-8

#define inf 0xfffffff

using namespace std;

/*題意:給你n個點,和每個點之間的距離,問你從0,0點遍歷所有點,每個點可以多次遍歷的情況下,費用最小。

想法:首先來個floyd,求個最短路,因為n(1<=n<=10),所以直接全排列就可以,列舉經過路徑的狀態,當然起始的時候是0,結束的時候也是0.

既然說到狀態,我們就再來一發狀態轉移dp。。。。

狀態轉移方程; dp[status][i] 表示i點到status狀態下的最短距離

dp[status][i] = min(dp[status][i],dp[status'][j] + op[j][i]);

*/int n;

int op[109][109];

int dp[1<<11][50];

int a[1009];

int main()

}for(int k = 0; k<=n; k++)}}

memset(dp,0,sizeof(dp));

for(int s = 0;s<(1<//狀態s中只包含第i個點

dp[s][i] = op[0][i];

else}}

}}}int _ans = max;

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

}for

(int k =

0;k<=n;k++)}}

for(

int i =

0;i= i+1

;int _min = max;

do sum+=op[

0][a[

0]];

sum+=op[a[n-1

]][0

]; _min =

min(_min,sum);

}while

(next_permutation

(a,a+n));

cout<<_min<}return0;

}

poj 3311 狀態壓縮dp

題目大意 類似於tsp問題,只是每個點可以走多次,比經典tsp問題不同的是要先用弗洛伊的預處理一下兩兩之間的距離。求最短距離。解析 可以用全排列做,求出乙個最短的距離即可。或者用狀態壓縮dp.用乙個二進位制數表示城市是否走過 狀態表示 dp state i 表示到達i點狀態為state的最短距離 狀...

POJ 3311 旅行商問題 狀態壓縮 dp

最近做 dp 做的起勁啊。旅行商問題的狀態壓縮 dp i j 表示 遍歷 i 中所有城市一遍 並且現在在 j 的最短距離是多少。第乙個點可以遍歷兩次所以先不設定為1,並且這個狀態是合法狀態,這個點曾經是最困擾我的。include include include include include inc...

POJ 1324(A 狀態壓縮)

真是好題啊,各種tle之後看了人家的解題報告才a的 1 一開始用deque儲存狀態資訊,用queue進行bfs,tle 2 試圖用陣列儲存狀態資訊,自己寫佇列進行bfs,還是tle 3 由於row和col都小於20,試圖用5 2個bit表示乙個位置,還是tle 終於看了discuss,找到了大牛的解...