POJ 1185 炮兵陣地(狀壓dp)

2022-06-20 21:18:16 字數 1343 閱讀 3844

題意:

思路:每一行最多只有10列,所以可以用二進位制來表示每一行的狀態。

d【i】【j】【k】表示第i行狀態為k時,並且上一行狀態為j時的最大炮兵數。

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9 #include10 #include11 #include

12using

namespace

std;

13 typedef long

long

ll;14 typedef pairpll;

15const

int inf = 0x3f3f3f3f;16

const

int maxn = 20+5;17

18int

n, m;

1920

char s[20

];21

int st[105

];22

int tmp[105

];23

int num[105

];24

int d[105][105][105

];25

26int calc(int

x)27

34return

tmp;35}

3637

intmain()

3851}52

53int top=0;54

for(int i=0;i

/記錄可行狀態

5562}63

64int ans=0

;65 memset(d,-1,sizeof

(d));

66for(int i=0;i//

第一行狀態

6770

71for(int i=2;i<=n;i++)

7290

91 d[i][k][j]=max(d[i][k][j],d[i-1][t][k]+num[j]);92}

93}94}

95}9697

for(int i=0;i)

98for(int j=0;j)

99 ans=max(ans,d[n][i][j]);

100 printf("

%d\n

", ans);

101}

102return0;

103 }

POJ1185(炮兵陣地) 狀壓DP

每一行的狀態是取決於上一行和上上一行的,所以每次更新的時候需要記錄當前行的狀態和下一行的狀態,然後再進行遞推。不過估算了一下複雜度是10的11次方,嚇得我都沒敢寫啊!看了一下別人的部落格,居然真有這樣寫過的,於是就自己實現一邊啦 最後看了以下討論版,處理一下複雜度可以降低的,最後貼討論版 思路 令p...

POJ1185 炮兵陣地 狀壓dp

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

POJ 1185 炮兵陣地 狀壓DP

炮兵陣地 time limit 2000ms memory limit 65536k total submissions 25954 accepted 10004 description 司令部的將軍們打算在n m的網格地圖上部署他們的炮兵部隊。乙個n m的地圖由n行m列組成,地圖的每一格可能是山地...