POJ 1185 炮兵陣地 狀壓DP 狀態預處理

2021-08-28 11:01:18 字數 2025 閱讀 4061

題目鏈結

題意:p處放大炮h不可放,黑色區域為攻擊範圍,求大炮不能相互攻擊的情況下,安裝最多的大炮數.

分析:三維狀壓dp

一開始亂寫了一通,真不知道寫的是什麼,竟然過了樣例,欺騙了自己???

看了題解要提前把狀態預處理一下,其實也就60個狀態滿足,然後三維狀壓,突然靈感來了。

仔細一想,二維就夠了呀,上去就是寫乙個二維狀壓???不過樣例???

d p[

i][j

]=ma

x(dp

[i][

j],d

p[i−

1][u

]+nu

m[vi

s[j]

]);dp[i][j]= max(dp[i][j], dp[i - 1][u] + num[vis[j]]);

dp[i][

j]=m

ax(d

p[i]

[j],

dp[i

−1][

u]+n

um[v

is[j

]]);

仔細再一想,不對。第i行的所有狀態不能轉移到第i + 1行狀態,按照二維的寫法,第i + 1行的所有狀態會推到第i + 2行的所有狀態,但是有可能第i行的所有狀態不滿足第i + 2行的所有狀態,所以這個方程不對。。。

應該開三維,dp[

i][j

][u]

=max

(dp[

i][j

][u]

,dp[

i−1]

[u][

v]+n

um[v

is[j

]])dp[i][j][u] = max(dp[i][j][u], dp[i - 1][u][v] + num[vis[j]])

dp[i][

j][u

]=ma

x(dp

[i][

j][u

],dp

[i−1

][u]

[v]+

num[

vis[

j]])

#include #include #include using namespace std;

#define met(s) memset(s, 0, sizeof(s))

#define rep(i, a, b) for(int i = a; i <= b; ++i)

template inline void scan_d(t &ret) }

typedef long long ll;

typedef unsigned long long ull;

typedef pairpii;

const int inf = 0x3f3f3f3f;

const int mod = 1e8;

const int maxn = 110;

int dp[110][65][65], num[1 << 11];

int a[maxn], vis[65];

int p = 0, n, m; char ch;

bool judge(int x)

inline void init()

// printf("%d %d\n",i, num[i]); }}

int main()

a[i] = ans;

} for(int i = 0; i < p; ++i)

for(int i = 0; i < p; ++i)

} for(int i = 3; i <= n; ++i)

}} }

int sum = 0;

for(int i = 0; i < p; ++i)

} printf("%d\n", sum);

return 0;

}

POJ1185(炮兵陣地) 狀壓DP

每一行的狀態是取決於上一行和上上一行的,所以每次更新的時候需要記錄當前行的狀態和下一行的狀態,然後再進行遞推。不過估算了一下複雜度是10的11次方,嚇得我都沒敢寫啊!看了一下別人的部落格,居然真有這樣寫過的,於是就自己實現一邊啦 最後看了以下討論版,處理一下複雜度可以降低的,最後貼討論版 思路 令p...

POJ1185 炮兵陣地 狀壓dp

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

POJ 1185 炮兵陣地 狀壓DP

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