題目鏈結
題目大意:有乙個旅行家計畫旅行,他所在城市有m個城市,在城市之間有p條路徑。從某個城市沿著某條道路到相鄰的城市需要坐馬車,而乘坐馬車需要車票。一張車票只能通過一條路,每張車票都記有馬的數量。從乙個城市到另乙個城市所需要的時間是城市之間道路的長度除以馬的數量的結果。這位旅行家一共有n張車票,第i張車票上的馬的數量是ti。求從城市a到城市b的最短時間。無法到達輸出impossible。
思路:暴力搜尋複雜度太高,可以使用狀態壓縮dp的方法,利用二進位制壓縮用s來表示車票的集合。
dp[s][v]:剩餘的車票集合為s且當前所在城市為v所需要的最小花費。
邊界條件: dp[(1<
狀態轉移方程 : dp[s & (1(k為列舉s中的每一張車票)。
**:#include #include #include #include#include #include #include #include #include#include#includeusing namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define rep(i, a, b) for(int i(a); i <= (b); ++i)
#define dec(i, a, b) for(int i(a); i >= (b); --i)
#define mp make_pair
const double inf = 1e8;
const int n = 100000 + 10;
const int m = 10000 + 10;
const int q = 1000 + 10;
const int a = 100 + 10;
const int maxn = 30 + 5;
int n,m,a,b;
int t[maxn],g[maxn][maxn];
double dp[1 << 10][maxn];
void solve(void){
rep(i,0,(1<>i) & 1){
rep(u,0,m-1){
if(g[v][u] >= 0){
dp[s & ~(1< 組
6
POJ 2686 狀態壓縮DP
大致題意 有m座城市,城市間有p條道路,商人持有n張車票,張車票對應相應的馬匹數為 ti 需要從城市a前往城市b。兩個直接相連城市花費時間為道路長度除以車票對應馬匹數。求所需最小時間,不可達輸出 impossible 1 n 8,2 m 30。考慮 現在所餘車票集合s,目前位於城市v 的狀態,n範圍...
poj2686 狀態壓縮dp
這個題的意思是給你乙個m個頂點,p條邊的無向圖,現在想從a走到b,旅者也帶有n張車票,每張車票上有一定數量的馬匹數量,經過一條邊必須使用車票,且時間花費是邊的長度除以馬匹數量,問你最少多長時間到達b 我們可以定義狀態dp s u 表示從在u點持有s的車票,那麼下面就可以採用刷表法更新最短路,如下 i...
POJ 2686 列印完數
時間限制 1000ms 記憶體限制 65536kb 描述乙個數如果恰好等於它的因子之和,這個數就成為 完數 例如,6的因子為1 2 3,而6 1 2 3,因此6是 完數 程式設計序列印出1000之內 包括1000 所有的完數,並按如下格式輸出其所有因子 6 its factors are 1,2,3...