HDU 3681 bfs 狀壓dp 二分

2021-10-04 13:56:50 字數 1685 閱讀 4073

題目:click

題意:給定乙個n*m的地圖,d表示不能走的地方,g補充滿能量,問從f點走完所有的y點最小的能量,走乙個消耗一格能量。

注意一下題目中所給的範圍,y+g的數量不超過15。在無數條路徑中找出一條最佳路徑,d是不能走的,所需點的數量頂多16個(加上了f點),其實可以發現本質就是乙個tsp的變形問題,所需要的點也就這三個。bfs處理出每兩個點的最短距離,建立乙個新的圖。

之後直接狀壓dp,但是我們需要注意狀態的的屬性問題,取最大還是最小值進行狀態轉移?取max有可能將最小路徑的值覆蓋,取min可能不能確保是這條路上的max。二分答案即可。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define inf 0x3f3f3f3f

#define max_len 50100*4

using

namespace std;

typedef

long

long ll;

const

int mod=

1e9+7;

const

int maxn=

1e7+5;

int mo[4]

[2]=

,,,}

;int n,m,state,fvis;

bool vis[20]

[20];

int mp[20]

[20];

int dp[20]

[(1<<18)

];int cnt=0;

struct aa[20]

;struct b

;int dis[20]

[20];

void

bfs(

int t1,

int t2)

hh.push

(tmp);}

hh.pop();

}}bool

check

(int res)

int temp=i|(1

<(mp[a[k]

.x][a[k]

.y]==

'g')

dp[k]

[temp]

=max

(dp[k]

[temp]

,dp[j]

[i]-dis[j]

[k]);}

}}return

false;}

intmain()

}getchar()

;}memset

(dis,inf,

sizeof

(dis));

for(i=

0;iint ans=-1

;int l=

0,r=

250;

while

(l<=r)

else

l=mid+1;

}printf

("%d\n"

,ans);}

return0;

}

hdu 3681 bfs 二分 狀壓dp判斷

思路 機械人從出發點出發要求走過所有的y,因為點很少,所以就能想到經典的tsp問題。首先bfs預處理出 y f g 之間的最短距離,由於g點可以充電,到達g點就把當前能量更新為電池容量然後繼續走。因為每個g點只能充一次電,這就好像tsp中的每個點只能走一次一樣,然後就是二分答案了,用狀壓dp判定當前...

hdu 3681 bfs 二分 狀壓dp判斷

思路 機械人從出發點出發要求走過所有的y,因為點很少,所以就能想到經典的tsp問題。首先bfs預處理出 y f g 之間的最短距離,由於g點可以充電,到達g點就把當前能量更新為電池容量然後繼續走。因為每個g點只能充一次電,這就好像tsp中的每個點只能走一次一樣,然後就是二分答案了,用狀壓dp判定當前...

HDU 5094 題解(狀壓BFS)

maze 題目中文大意 這個故事發生在 星際迷航 的背景下。星際爭霸 的副隊長史波克落入克林貢的詭計中,被關押在他們的母親星球qo nos上。企業的上尉詹姆斯 t 柯克 james t.kirk 不得不乘宇宙飛船去救他的副手。幸運的是,他偷走了史波克所在的迷宮地圖。迷宮是乙個矩形,它有n行垂直和m列...