在乙個位置上有乙個人,同時還有n
nn(n⩽10
n \leqslant 10
n⩽10
)個怪物,這個人會不停地釋放技能,技能可以瞬間殺死周圍8個格仔上的怪物,行走速度是每個單位時間走乙個單位距離,現在問這個人最快要多久才能殺死所有怪物(還要輸出路徑)
輸入是先輸入地圖範圍s和怪獸數量n,然後輸入此人位置,接下來n行,每行表示怪獸的位置
5 3
2 21 1
3 31 2
0
5 3
3 31 1
5 51 5
6
3 22 2
2 32 4
3 44 4
5⩽s
⩽30
5 \leqslant s \leqslant 30
5⩽s⩽30
n ⩽10
n \leqslant 10
n⩽10
用狀壓dp壓縮殺怪狀態,然後設f[s
][i]
[j
]f[s][i][j]
f[s][i
][j]
為殺怪狀態為s,且現在在i
ii怪的j方向
上j方向上
j方向上
,然後每一次列舉從哪個位置到那個位置,然後路徑只要在dp的時候記錄一下即可
#include
#include
#include
#define abs(x) (x)<0?-(x):(x)
using
namespace std;
int n,m,ans,sum,x[20]
,y[20
],f[(1
<<12)
][20]
[10],s[(1
<<12)
][20]
[10],s1[(1
<<12)
][20]
[10];
const
int dx[9]
=;const
int dy[9]
=;intdis
(int from,
int fw,
int to,
int tw)
//計算兩個點的距離
return
(abs
(x1-x2))+
(abs
(y1-y2));
}voiddg(
int s,
int dep,
int w)
while
(y1!=y2)
}int
main()
int k=(1
<-1
;for
(int i=
1;i<=n;
++i)
for(
int j=
0;j<=9;
++j)
if(f[k]
[ans]
[sum]
>f[k]
[i][j]
)//取最大
ans=i,sum=j;
printf
("%d"
,f[k]
[ans]
[sum]);
if(f[k]
[ans]
[sum])dg
(k,ans,sum)
;//遞迴輸出
return0;
}
JZOJ4743 積木 狀壓dp
顯然是狀壓dpdp dp。設f s i 1.3 f s i 1.3 f s i 1.3 表示使用的積木集合是s ss,最後使用的是積木i ii,是以長 寬 高維度往上的最高值。列舉s ss,再列舉最近放置的積木i ii和接下來要放置的積木j jj。然後再列舉使用哪一維往上搭。轉移方程過於顯然了吧。也...
jzoj 1266 玉公尺田(狀壓dp)
description 農民 john 購買了一處肥沃的矩形牧場,分成m n 1 m 12 1 n 12 個格仔。他想在那裡的一些格仔中種植美味的玉公尺。遺憾的是,有些格仔區域的土地是貧瘠的,不能耕種。精明的 fj 知道奶牛們進食時不喜歡和別的牛相鄰,所以一旦在乙個格仔中種植玉公尺,那麼他就不會在相...
狀壓DP 最優配對問題(jzoj 3420)
在平面上有n個點,現在要把他們拼成n 2對,拼接兩個點的代價是他們的平面距離,現在問代價總和最小是多少 4 8730 9323 3374 3929 7890 6727 1257 468920366.602 n 20 用dfs每一次選1個數和當前數字匹配,如果當前數字選過了,就進入下一層 includ...