題目鏈結
題意: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列組成,地圖的每一格可能是山地...