POJ 1185 炮兵陣地(狀壓DP)

2021-10-02 14:19:35 字數 4197 閱讀 8909

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

如果在地圖中的灰色所標識的平原上部署一支炮兵部隊,則圖中的黑色的網格表示它能夠攻擊到的區域:沿橫向左右各兩格,沿縱向上下各兩格。圖上其它白色網格均攻擊不到。從圖上可見炮兵的攻擊範圍不受地形的影響。

現在,將軍們規劃如何部署炮兵部隊,在防止誤傷的前提下(保證任何兩支炮兵部隊之間不能互相攻擊,即任何一支炮兵部隊都不在其他支炮兵部隊的攻擊範圍內),在整個地圖區域內最多能夠擺放多少我軍的炮兵部隊。

第一行包含兩個由空格分割開的正整數,分別表示n和m;

接下來的n行,每一行含有連續的m個字元(『p』或者』h』),中間沒有空格。按順序表示地圖中每一行的資料。n <= 100;m <= 10。

僅一行,包含乙個整數k,表示最多能擺放的炮兵部隊的數量。

5

4phpp

pphh

pppp

phpp

phhp

6
題意:乙個地圖有h,p兩種點,p可以放炮兵,每個炮兵可以攻擊上下左右相鄰兩格的地方。問最多可以放多少個炮兵而不互相攻擊。

幾乎是裸dp了呀,需要注意的就是炮兵可以攻擊到兩層。那麼在按層數往下dp的時候需要知道上一層和上上一層的狀態是什麼,因此需要增加一維。儲存上一層的狀態。dp[i][j][k]表示第i層,mark[j]狀態下,上一層是mark[k]狀態下能放炮兵的最大值。

由於交了幾次都超時了。也不知道是哪個地方,就改了一堆可以優化時間的地方。

//#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ios std::ios::sync_with_stdio(false)

#define int long long

using

namespace std;

const

int n =

100;

int cnt =0;

// 記錄狀態數

int mark[61]

;// 狀態最多60種,開大了還超記憶體

int dp[

102][61

][61]

;int a[

102]

;// 整數記錄每行的地圖,優化時間

int value[61]

;// 儲存每個狀態下炮兵的個數,每個狀態只計算一次,優化時間

int n,m,en;

// en用來確定右邊界,只計算一次(1

check

(int lev,

int sta)

intcount_

(int x)

return res;

}signed

main()

mark[cnt]=(

1<<12)

;// 設定乙個最大的右邊界,不然會出現死迴圈

cin>>n>>m; en =(1

<

;for

(int i =

0; i < n ; i ++

) a[i]

= tmp;

}memset

(dp,0,

sizeof

(dp));

for(

int i =

0; mark[i]

< en ; i ++

)// 先處理第一層的情況

}for

(int i =

1; i < n ; i ++

)// 列舉層數}}

}int ans =0;

for(

int j =

0; mark[j]

< en ; j ++

)for

(int k =

0; mark[k]

< en ; k ++

) ans =

max(dp[n-1]

[j][k]

,ans)

; cout<

return0;

}/**

**超時的話可以試試這組資料

100 10

phppphpppp

pphhpphhhh

pppppppppp

phppphpppp

phhpphhphp

phppphpppp

pphhpphhhh

pppppppppp

phppphpppp

phhpphhphp

phppphpppp

pphhpphhhh

pppppppppp

phppphpppp

phhpphhphp

phppphpppp

pphhpphhhh

pppppppppp

phppphpppp

phhpphhphp

phppphpppp

pphhpphhhh

pppppppppp

phppphpppp

phhpphhphp

phppphpppp

pphhpphhhh

pppppppppp

phppphpppp

phhpphhphp

phppphpppp

pphhpphhhh

pppppppppp

phppphpppp

phhpphhphp

phppphpppp

pphhpphhhh

pppppppppp

phppphpppp

phhpphhphp

phppphpppp

pphhpphhhh

pppppppppp

phppphpppp

phhpphhphp

phppphpppp

pphhpphhhh

pppppppppp

phppphpppp

phhpphhphp

phppphpppp

pphhpphhhh

pppppppppp

phppphpppp

phhpphhphp

phppphpppp

pphhpphhhh

pppppppppp

phppphpppp

phhpphhphp

phppphpppp

pphhpphhhh

pppppppppp

phppphpppp

phhpphhphp

phppphpppp

pphhpphhhh

pppppppppp

phppphpppp

phhpphhphp

phppphpppp

pphhpphhhh

pppppppppp

phppphpppp

phhpphhphp

phppphpppp

pphhpphhhh

pppppppppp

phppphpppp

phhpphhphp

phppphpppp

pphhpphhhh

pppppppppp

phppphpppp

phhpphhphp

phppphpppp

pphhpphhhh

pppppppppp

phppphpppp

phhpphhphp

phppphpppp

pphhpphhhh

pppppppppp

phppphpppp

phhpphhphp

phppphpppp

pphhpphhhh

pppppppppp

phppphpppp

phhpphhphp

**/

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