dp[s][i] = op[0][i];#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個點
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,找到了大牛的解...