POJ 1185 炮兵陣地 狀壓DP

2021-08-18 18:16:41 字數 951 閱讀 4185

題意:中文題意,就不多贅述了。

題解:一道經典的狀壓dp。dp【i】【j】【k】表示第 i 行,第j個合法狀態 ,第i-1 行第k個合法狀態的合法安置數目,

所以我們要預處出所有合法狀態。

此處我用顯然來代替我得思路。

顯然是正確的。

我在**注釋裡面寫的非常詳細。

看**把:

#include#include#include#includeusing namespace std;

int map[1 << 11]; //用乙個2進製數表示第i行的地圖狀態,0為空地,1為山地

int stk[1 << 11]; // 二進位制記錄合法狀態。

int dp[101][64][64]; //dp【i】【j】【k】 表示第i行的j狀態,i-1行的k狀態能放的最大數目。

int sum[66]; // 某個二進位制狀態的1的個數。1代表放炮,0代表不放炮

int cnt = 0 ,n,m; // cnt 表示和合法狀態有多少個。

int getsum(int i)

return sum; // 返回sum

}int judge(int x)

void init()

} memset(dp,0,sizeof(dp)); // 清空dp陣列

init(); // 預處理出所有合法狀態。

for(int i = 0; i < cnt ; i ++)

for(int i = 0 ; i < cnt ; i ++)

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

}} }

int ans = 0 ; // 找出最大值。

for(int i = 0 ; i < cnt ; i ++)

} printf("%d\n",ans);

}

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列組成,地圖的每一格可能是山地...