poj 1185 炮兵陣地

2021-06-12 19:13:16 字數 1977 閱讀 6462

題目鏈結

題意:在n*m的網格地圖上部署炮兵部隊。地圖的每一格可能是山地(用"h" 表示),也可能是平原(用"p"表示),如下圖。在每一格平原地形上最多可以布置一支炮兵部隊(山地上不能夠部署炮兵部隊);一支炮兵部隊在地圖上的攻擊範圍如圖中黑色區域所示: 

如果在地圖中的灰色所標識的平原上部署一支炮兵部隊,則圖中的黑色的網格表示它能夠攻擊到的區域。炮兵的攻擊範圍不受地形的影響。 

現在,如何部署炮兵部隊,使得任何一支炮兵部隊都不在其他支炮兵部隊的攻擊範圍內,在整個地圖區域內最多能夠擺放多少我軍的炮兵部隊。

#include#include#include#includeusing namespace std;

/** 每行擺放炮兵的方法數的最大值 */

#define inf 70

/** 總行數的最大值 */

#define nmax 103

/** 每一行炮兵的合法的擺放狀態 */

int state[inf];

/** 每一種擺放方法的炮兵,state[i]這一擺放方法中炮兵總數為count[i] */

int count[inf];

/** f[i][j][k] 表示在上一行以state[k] 的方法擺放的前提下,第i 行以state[j] 的方法擺放的方法總數 */

int f[nmax][inf][inf];

/** map陣列是輸入的地形資料的壓縮 */

int map[nmax];

int main()

} /** size表示每行允許擺放炮兵的情況數 */

int size = 0;;

/* 對size的數值進行計算,

* 列舉從0 到 1 << m 的所有數,每個數的二進位制表示中的1 表示在

* 該處擺放炮兵,0 表示不擺放。

* 擺放遵循的規則是:不允許兩個炮兵之間的間距 < 2

*/for( i = 0; i < ( 1 << m ); i ++ )

else flag --;

ii = ii >> 1;

} if( ii == 0 )

} /** 對行進行迴圈 */

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

/** 對上一行的擺放狀態進行迴圈 */

for( int k1 = 0; k1 < size; k1 ++ )

/** 對上兩行的擺放狀態進行迴圈 */

for( int k2 = 0; k2 < size; k2 ++ )

/** 若該種上一行和上兩行的擺放狀態合理 */

if( f[i - 1][k1][k2] > 0 )

/** 對當前行的擺放狀態進行迴圈 */

for( int j = 0; j < size; j ++ )

/* 若當前行的這一擺放狀態與前一行和前兩行的擺放狀態都不衝突

* 且和地形也不衝突,則比較大小後更新

* f[i][j][k1] = f[i - 1][k1][k2] + count[j];

*/if( ( state[k1] & state[j] ) == 0 && ( state[k2] & state[j] ) == 0 )

if( ( map[i] | state[j] ) == map[i] )

if( f[i][j][k1] < f[i - 1][k1][k2] + count[j] )

f[i][j][k1] = f[i - 1][k1][k2] + count[j];

/** 計算第i 行的各種擺放方式中炮兵數的最大值 */

int max = 0;

for( i = 0; i < size; i ++ )

printf("%d\n", max );

return 0;

}

POJ 1185 炮兵陣地

include include include include include include include include include include include include include include define sz v int v size define rep i,n ...

POJ 1185 炮兵陣地

狀態壓縮專題第一題,自己想了很久,最終還是以別人的 為模板寫的。dp共三維,一維是行數,一維是前一行狀態,一維是前第二行狀態。ps 直接開三維太大,用s陣列記錄下所有可能出現的情況,大大減少時間和空間。include include include includeusing namespace st...

POJ 1185 炮兵陣地

非常有趣的乙個問題,也困擾了我一段時間。利用遞迴的話由於有大量重複計算的內容,所以可以使用動態規劃,獲取所有的需要計算的值。題目內容中存在上兩行都對當前行的選擇存在影響,所以不同於一般的動態規劃。我本來是希望將地圖的每兩行合併為一行,之後通過動態規劃儲存在確定上兩行的情況下的最優解。不過在最壞情況下...