狀壓DP 劍之修煉(jzoj 2130)

2021-09-25 05:28:51 字數 1815 閱讀 6784

在乙個位置上有乙個人,同時還有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...