題目大意:
poj這題是變形:
乙個送外賣的人,要將外賣全部送去所有地點再回到店裡,求最短路。店在0點。
因為這裡可以重複經過每個地點。所以首先用floyd求出最短路,然後再進行dp即可
我看題解基本上都是遞推dp,我寫的記憶化搜尋。因為沒有刪除別人的變數定義,導致陣列開小,又debug了2個小時。
遞推的思路也不難dp[s][j]表示經過s集合中的點,j是最後乙個經過的點的最短路徑。
刷表法:列舉i, j。j必須在集合中存在,i必須不存在。
dp[ s^(1/dfs
#include
#define inf 100000000
using
namespace std;
int dis[12]
[12];
int dp[12]
[(1<<12)
];int n;
intdfs
(int i,
int s)
if(s==0)
dp[i]
[s]=inf;
for(
int j=
0;jreturn dp[i]
[s];
}int
main()
}memset
(dp,-1
,sizeof
(dp));
//最短路
for(
int k =
0;k <= n;
++k)}}
} cout<<
dfs(0,
(1<
)<
}return0;
}
#include//遞推
#define inf 100000000
using
namespace std;
int dis[12]
[12];
int dp[(1
<<12)
][12]
;int n;
intmain()
}memset
(dp,-1
,sizeof
(dp));
//最短路
for(
int k =
0;k <= n;
++k)}}
}memset
(dp,3,
sizeof
(dp));
for(
int s=
0;s<
;s++
)for
(int j=
0;j}}
}int min=inf;
for(
int i=
1;i<=n;i++
) cout<
}return0;
}
poj3311 TSP問題 狀壓DP
題意 從0走遍1 n最後再返回到0,乙個點可以走多次,求經過的最短距離。分析 由於乙個點可以走多次,所以需要求出任意兩點間的最短距離,就要用到floyd演算法,同時接下來可以搜尋做複雜度是o n 而狀態壓縮的時間效率就高了,關於dp自己有時候狀態轉移方程知道了,卻不知道如何去實現,迴圈時哪層放在外面...
狀壓dp POJ 3254 農夫玉公尺田
轉大佬的思路 對於0 1狀態矩陣,自然而然會想到用狀態壓縮來做,把一行 也可以按列 的狀態壓縮成乙個十進位制數 行狀態 另種植or不種植也可以用0 1表示,並根據題目所說不能挨著種植,即這一行的某個位置種植了,下一行的同一位置就不能種植,可以知道兩行的種植狀態相位與要為0。另外說乙個行種植狀態有效,...
狀壓DP《旅行商問題》
旅行社問題就是給乙個有向圖,從點0走一圈全部結點再走回來所花費的費用最少是多少。狀壓dp一般n 15。因為是走完全部點,那麼走到2點的費用有可能走了5,也可能沒走,那麼就不能簡單的用最短路來找。因為要求跑完全部點回到0,而最小樹形圖的話無法做到。狀壓dp是指在乙個點上存在多種狀態,這些狀態可以用二進...