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