1595 炮兵陣地

2022-06-20 05:54:15 字數 1483 閱讀 2773

1595:炮兵陣地

時間限制: 1000 ms 記憶體限制: 524288 kb

提交數: 503 通過數: 322

【題目描述】

原題來自:noi 2001

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

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

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

【輸入】

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

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

【輸出】

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

n≤100,m≤10。

思路:思路很簡單吧。。(但是實現非常困難qwq,作為乙個不怎麼細心的孩子,調了三個小時qwq)

設定變數為f[i][j][k]表示已經處理到了第i行,第i行狀態是b[j],第i-1行狀態是b[k]

轉移方程:f[i%3][k][j]=max(f[(i-1)%3][j][l]+sum[k],f[i%3][k][j]);

注意,這裡的i%3應用的是滾動陣列的思想。因為對於乙個狀態來說,需要記錄的只是與之相關的三行,其它的都可以由轉移得到,所以為了減小空間複雜度,防止mle,我們只記錄三行

做題時出問題的地方:

1.dp的時候把對應的sum[k]加成了sum[j]

2.f陣列開小了,最後結果爆了

3.初始化出鍋

**(已ac):

#includeusing namespace std;

int n,m;

char a[1050][1050];

int f[14][1050][1050];

int b[1020000];

int cnt;

int sum[102000];

int dat[102000];

int count(int x)

else

}dat[i]=s; }

/* for(int i=1;i<=n;i++) cout做題經驗:

1.平常做題的時候不要和題解對**,不要跟著題解對拍,(特別是dp類題目,對拍根本拍不出來),最好是自己從頭到尾看一遍自己的**,檢查一下是不是有什麼細節問題

2.跟著自己的感覺走,不要老是看題解,因為題解的方法可能很多,不一定是你的方法

1185 炮兵陣地

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

poj 1185 炮兵陣地

題目鏈結 題意 在n m的網格地圖上部署炮兵部隊。地圖的每一格可能是山地 用 h 表示 也可能是平原 用 p 表示 如下圖。在每一格平原地形上最多可以布置一支炮兵部隊 山地上不能夠部署炮兵部隊 一支炮兵部隊在地圖上的攻擊範圍如圖中黑色區域所示 如果在地圖中的灰色所標識的平原上部署一支炮兵部隊,則圖中...

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 ...