題目: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列...