題意:給出乙個n*m的矩陣,矩陣的每個方格標有p/h p表示可以安置大炮,h表示不能安置大炮,當大炮安置於(i,j)點時,其左右兩個單位以及上下兩個單位都在攻擊範圍,求在兩支大炮不會相互攻擊的前提下,最多能夠安置大炮的數量。
思路:當前行大炮的的安置要受其前兩行的影響,所以狀態轉移方程有:
dp[i][j][k] = max(dp[i][j][k],dp[i - 1][k][l] + sum[j]) dp[i][j][k]表示第i行的狀態為j第i - 1的狀態為k sum[j]表示該行取j狀態時可能增加的數量;
#include #include#include
#include
#include
#define cl(a,num) memset(a,num,sizeof(a))
#define m 13
#define n 107
#define mod 100000000
using
namespace
std;
const
int inf = 1999999
;int map[n],dp[n][66][66
];int state[1
<
intn,m,total;
char
str[n][m];
int sum[66
];bool isok(int
x)int getsum(int
x)
returns;}
void
init()
}}int
main()
}total = (1
<
init();
cl(dp,0);
//初始化第一行
for (i = 0; i < ct; ++i)
for (i = 1; i < n; ++i)}}
else
dp[i][j][k] = max(dp[i][j][k],dp[i - 1][k][0] +sum[j]);}}
}}
}int ans = 0
;
for (i = 0; i < ct; ++i)
}printf(
"%d\n
",ans);
return0;
}
PKU 1185 炮兵陣地 狀壓DP
題目鏈結 司令部的將軍們打算在nm的網格地圖上部署他們的炮兵部隊。乙個nm的地圖由n行m列組成,地圖的每一格可能是山地 用 h 表示 也可能是平原 用 p 表示 如下圖。在每一格平原地形上最多可以布置一支炮兵部隊 山地上不能夠部署炮兵部隊 一支炮兵部隊在地圖上的攻擊範圍如圖中黑色區域所示 如果在地圖...
POJ1185(炮兵陣地) 狀壓DP
每一行的狀態是取決於上一行和上上一行的,所以每次更新的時候需要記錄當前行的狀態和下一行的狀態,然後再進行遞推。不過估算了一下複雜度是10的11次方,嚇得我都沒敢寫啊!看了一下別人的部落格,居然真有這樣寫過的,於是就自己實現一邊啦 最後看了以下討論版,處理一下複雜度可以降低的,最後貼討論版 思路 令p...
POJ1185 炮兵陣地 狀壓dp
司令部的將軍們打算在n m的網格地圖上部署他們的炮兵部隊。乙個n m的地圖由n行m列組成,地圖的每一格可能是山地 用 h 表示 也可能是平原 用 p 表示 如下圖。在每一格平原地形上最多可以布置一支炮兵部隊 山地上不能夠部署炮兵部隊 一支炮兵部隊在地圖上的攻擊範圍如圖中黑色區域所示 如果在地圖中的灰...