pku 1185 炮兵陣地 狀壓DP

2021-09-06 05:42:55 字數 1195 閱讀 4923

題意:給出乙個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 表示 如下圖。在每一格平原地形上最多可以布置一支炮兵部隊 山地上不能夠部署炮兵部隊 一支炮兵部隊在地圖上的攻擊範圍如圖中黑色區域所示 如果在地圖中的灰...