原題鏈結
考察:狀壓dp
這個是acwing 1064. 小國王那道題的擴充套件
思路:這道題與小國王的區別在於前兩行影響當前行.並且這道題我們求的是炮的最大數量.有幾點必須說明:
不能效仿小國王開dp陣列f[i,i行狀態],如果這樣寫狀態轉移方程就是f[i,j] = f[i-2,k]+cnt[j]+cnt[k],列舉i行、i-1、i-2行狀態,當它們不在同一列且與地圖符合就遞推;看上去確實符合邏輯,但是注意這樣就不能保證i-1行能夠與i-3行匹配.如資料:4 1 p h p h這樣輸出就與答案不符. 但也不能寫成f[i,j] = f[i-1,k]+cnt[j].因為f[i-1,k]儲存的是i-1,i-2,i-3的最優解.而在第i行時,i-2行與f[i-1,k]的i-2行可能不是同一行.
答案最後是求最值,所以不要累加...
關於**為什麼不檢驗p與mp[i-2]:因為答案只會記錄到匹配的i、i-1行.也就是說不匹配的一直為0.更何況i-2行是先被計算的.
1 #include 2 #include 3 #include 4 #include 5 #include 6using
namespace
std;
7const
int n = 110,m = 11;8
char
s[n][m];
9int mp[n],n,m,f[2][1
<1
<10 vectorv;
11int getcnt(int
x)12
17void
change()
1831
if(ok) v.push_back(i);32}
33}34int
main()
3550
for(int i=0;i)
51for(int j=0;j1
][v[i]][v[j]],ans);
52 printf("
%d\n
",ans);
53return0;
54 }
炮兵陣地 POJ 1185
司令部的將軍們打算在nm的網格地圖上部署他們的炮兵部隊。乙個nm的地圖由n行m列組成,地圖的每一格可能是山地 用 h 表示 也可能是平原 用 p 表示 如下圖。在每一格平原地形上最多可以布置一支炮兵部隊 山地上不能夠部署炮兵部隊 一支炮兵部隊在地圖上的攻擊範圍如圖中黑色區域所示 如果在地圖中的灰色所...
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 ...