hdu 3681 壓縮dp 搜尋

2022-06-02 13:57:09 字數 1757 閱讀 2985

題意:乙個機械人想越獄,他只能帶一定電量的電池,'s'表示道路可行,'g'表示充電器, 只可充電一次,但是可以經過很多次。'f'表示起點,'y'表示要破壞的機關,也是只能破壞一次,但是可以經過無數次。'd'表示不能經過的地點。求他能 破壞所有機關,帶的最小初始電量。

真是神煩無比啊啊,這題

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8

using

namespace

std;

9#define mod 1000000007

10const

int inf=0x3f3f3f3f;11

const

double eps=1e-5

;12 typedef long

long

ll;13

#define cl(a) memset(a,0,sizeof(a))

14#define ts printf("*****\n");

15const

int maxn=17;16

intn,m,tt;

17int d[4][2]=;

18int dp[1

<19char

s[maxn][maxn];

20int

dist[maxn][maxn][maxn][maxn];

21int

cnt;

22int

start;

23int fin=0;24

bool

vis[maxn][maxn];

25struct

node

26node[maxn],st,ed;

29void bfs(int x,int y) //

x,y點到其他點的距離

3040}41

while(!q.empty()) q.pop();

42node now,next;

43 now.x=x,now.y=y;

44 dist[x][y][x][y]=0;45

q.push(now);

46 vis[x][y]=1;47

while(!q.empty())

4862}63

}64}65

bool check(int

v)6684}

85return0;

86}87int

main()

88103

}104 cnt=0

;105 fin=0

;106

for(i=0;i)

107117

else

if(s[i][j]=='y'

)118

123else

if(s[i][j]=='g'

)124

128}

129}

130int l=0

;131

int r=n*m;

132int ans=-1

;133

while(l<=r)

134141

else l=mid+1

;142

}143 printf("

%d\n

",ans);

144}

145 }

hdu 3681 計算幾何

還是太粗心了阿,求直線上的點到兩點間距離和的最小值 搞了好久阿,a點和b點有可能在直線的同側也可能在異側 view code include include const double eps 1e 9 struct pointa,b,c,a1,node double dis point a,poin...

HDU 3681 bfs 狀壓dp 二分

題目 click 題意 給定乙個n m的地圖,d表示不能走的地方,g補充滿能量,問從f點走完所有的y點最小的能量,走乙個消耗一格能量。注意一下題目中所給的範圍,y g的數量不超過15。在無數條路徑中找出一條最佳路徑,d是不能走的,所需點的數量頂多16個 加上了f點 其實可以發現本質就是乙個tsp的變...

hdu 3681 bfs 二分 狀壓dp判斷

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