洛谷P2704 NOI2001 炮兵陣地

2022-03-17 16:32:02 字數 2930 閱讀 9640

題目描述

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

如果在地圖中的灰色所標識的平原上部署一支炮兵部隊,則圖中的黑色的網格表示它能夠攻擊到的區域:沿橫向左右各兩格,沿縱向上下各兩格。圖上其它白色網格均攻擊不到。從圖上可見炮兵的攻擊範圍不受地形的影響。 現在,將軍們規劃如何部署炮兵部隊,在防止誤傷的前提下(保證任何兩支炮兵部隊之間不能互相攻擊,即任何一支炮兵部隊都不在其他支炮兵部隊的攻擊範圍內),在整個地圖區域內最多能夠擺放多少我軍的炮兵部隊。

輸入輸出格式

輸入格式:

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

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

輸出格式:

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

輸入輸出樣例

輸入樣例#1

5 4phpp

pphh

pppp

phpp

phhp

輸出樣例#1

6演算法:

狀壓dp

分析:

這個題跟corn fields也很像,只不過一道是講方案可行數,這個是講最大值(其實就是所有的可行數)。所有還是選擇狀壓dp。

不過這道題難在他很麻煩,因為他會向四周延伸2格,所以初始化的時候要左移1位和左移2位判斷。而存狀態的時候需要把當前行和上一行一起存了。再迴圈上上行。

其他就與普通狀壓沒什麼不同了。

不過有個坑點,讀入字元的時候要格外小心,我就因此wa了好多次,大家可以憑經驗選擇。

我還使用了乙個滾動陣列來優化這個程式。經觀察可得這一行的內容只與他的上一行內容有關,所以我原本的dp[i][state1][state2]的i只需要存兩個即可。所以還是用位運算優化,zyy大佬曾經告訴過我,假如滾動陣列用異或的話不但跑得快,而且寫得方便,所以這裡就用了異或來存陣列。

上**:

1 #include2 #include3

#define c continue

4using

namespace

std;56

char ch[11];7

int n,m,state[1025],cur[110],dp[2][1025][1025],ans,sum,fire[1025];8

bool flag; //

滾動陣列

910 inline void init() //

初始化1121}

2223 inline bool fit(int x,int k) //

當前狀態是否滿足當前行

2427

28int

main()

2941 flag=1;42

for (i=1;i<=sum;i++) //

預處理第一行

43if (fit(i,1

))44 dp[flag][i][1]=fire[i];

45 flag^=1;46

for (i=1;i<=sum;i++) //

預處理第二行

4753

for (i=3;i<=n;i++) //

枚舉行5470}

71}72}

73for (j=1;j<=sum;j++)

74for (k=1;k<=sum;k++)

75 ans=max(ans,dp[flag][j][k]);

76 printf("%d"

,ans);

77return0;

78 }

這道題我交洛谷是可以a的,但是玄學的是交poj是wa的。我考慮過是不是當前行狀態和上一行狀態的先後問題,但經試驗證明是沒關係的,具體原因我也搞不清,請各位大神指出。

嗯,就這樣了。

洛谷 P2704 NOI2001 炮兵陣地

給出n m的地圖,有很多空地p跟山地h,炮台可以攻擊周邊 求最多能放多少個炮台並且他們互不攻擊。n 100 m 10 這題是狀壓dp的一道經典題目,對於每行10個東東可以放就是2 10種可能,這樣轉移就會tle 所以我們發現因為任意2個炮之間距離至少為2,所以我們每行存在的可行狀態至多不超過2 5 ...

《洛谷P2704 NOI2001 炮兵陣地》

非常細細細的一題。首先,這資料量顯然是狀壓。dp i j k 表示 到第i行,第i行狀態為j,第i 1行狀態未k的最大方案數。我們從上向下考慮的話,每個放置的棋子會被上面兩行棋子的放置狀態所影響。所以我們每次轉移的時候需要列舉上面的兩行。這樣的話複雜度就是 n m m m。這顯然已經超了 但是正解還...

洛谷 P2704 NOI2001 炮兵陣地

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