題意:
給你乙個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 表示 也可能...