狀壓dp NOI 2001 炮兵陣地

2021-08-29 07:08:18 字數 2699 閱讀 8649

題意:

給你乙個n∗m

n∗mn∗

m的網格,每個各自最多放乙個炮兵,每乙個格仔有地形,平原可以放,山地不能放,並且乙個炮兵的上下左右兩個內不能放炮兵,問最多放多少炮兵。n

≤100;m

≤10

n≤100;m≤10

n≤100;

m≤10

。可以發現m非常小,考慮狀壓dp,這道題與常規狀壓dp的不同點是這道題的每一行狀態在轉移時要看之前兩行的狀態。

首先我們先將每一行哪些格仔可以放用二進位制表示出來,g[i

]g[i]

g[i]

表示第i

ii行地形情況的二進位制狀態。然後處理出一行內所有合法的情況。我們設dp[

i][j

][k]

dp[i][j][k]

dp[i][

j][k

]表示第i

ii行,當前狀態的j

jj,上一行的狀態是k

kk最多放多少炮兵,我們按順序列舉當前行,上一行,和上兩行的狀態,要保證當前行的狀態不與當前行的地形狀態衝突,當前行的狀態不與上一行和上兩行的狀態衝突,上一行和上兩行的狀態不衝突。

所以d p[

i][j

][k]

=max

(dp[

i][j

][k]

,dp[

i−1]

[k][

q]+s

[j])

dp[i][j][k]=max(dp[i][j][k],dp[i-1][k][q]+s[j])

dp[i][

j][k

]=ma

x(dp

[i][

j][k

],dp

[i−1

][k]

[q]+

s[j]

),s[j]

s[j]

s[j]

為j

jj狀態下1

11的個數,即為該狀態下可以放的炮兵的個數。最後答案就是max

maxma

x,i,

ji,j

i,j為最後一行和倒數第二行的所有狀態。

#include

using

namespace std;

int n,m,g[

1000000

],num,res[

1000000

],ans,dp[

105]

[1024][

1024

],s[

1000000];

char st[

1001000];

//g陣列為第i行山地平原情況的狀壓,0為平原,1為山地

intmain()

}for

(int i=

0;i<(1

<;++i)if(

!(i&

(g[1])

))//初始化第一行狀態

dp[1]

[num][0

]=s[num];}

}for

(int i=

1;i<=num;

++i)

//列舉第一行的狀態

for(

int j=

1;j<=num;

++j)

//列舉第二行的狀態 if(

!(res[i]

&res[j])&&

!(g[2]

&res[j]))

//判斷是否與地形和第一行衝突

dp[2]

[j][i]

=max

(dp[2]

[j][i]

,dp[1]

[i][0]

+s[j]);

for(

int i=

3;i<=n;

++i)

for(

int j=

1;j<=num;

++j)

//當前行的狀態 if(

!(g[i]

&res[j]))

//當前行的狀態不與地形衝突

for(

int k=

1;k<=num;

++k)

//前一行的狀態 if(

!(res[k]

&res[j]))

//前一行的狀態與當前行不衝突

for(

int q=

1;q<=num;

++q)

//前兩行的狀態 if(

!(res[q]

&res[k])&&

!(res[q]

&res[j]))

//前兩行的狀態不與前一行的狀態和當前行的狀態衝突

dp[i]

[j][k]

=max

(dp[i]

[j][k]

,dp[i-1]

[k][q]

+s[j]);

for(

int i=

1;i<=num;

++i)

for(

int j=

1;j<=num;

++j)

ans=

max(ans,dp[n]

[i][j]);

cout

}

狀壓DP NOI2001 炮兵陣地

p2704 題目描述 司令部的將軍們打算在n m的網格地圖上部署他們的炮兵部隊。乙個n m的地圖由n行m列組成,地圖的每一格可能是山地 用 h 表示 也可能是平原 用 p 表示 如下圖。在每一格平原地形上最多可以布置一支炮兵部隊 山地上不能夠部署炮兵部隊 一支炮兵部隊在地圖上的攻擊範圍如圖中黑色區域...

滾動陣列 狀壓DP NOI2001炮兵陣地

題目描述 司令部的將軍們打算在n m的網格地圖上部署他們的炮兵部隊。乙個n m的地圖由n行m列組成,地圖的每一格可能是山地 用 h 表示 也可能是平原 用 p 表示 如下圖。在每一格平原地形上最多可以布置一支炮兵部隊 山地上不能夠部署炮兵部隊 一支炮兵部隊在地圖上的攻擊範圍如圖中黑色區域所示 如果在...

NOI2001《炮兵陣地》 狀壓DP

炮兵陣地 time limit 1000ms memory limit 65536k total submit 30 accepted 14 description 司令部的將軍們打算在n m的網格地圖上部署他們的炮兵部隊。乙個n m的地圖由n行m列組成,地圖的每一格可能是山地 用 h 表示 也可能...