題目鏈結
因為m <= 10,考慮狀壓dp
先dfs搜出所有可能狀態
f[i][j][k] 表示上上行是 i, 上行是 j, 第 k 行取得的最大值
但如果直接開滿陣列,mle
考慮滾動陣列
此題只需保留2個狀態,上上行,上行
所以用四層迴圈列舉——超時
考慮剪枝
放進上上行時先與題述條件對比
放入上行是與上上行和題述條件進行比較
。。。。。。
因為這個dp陣列單調遞增,不用擔心之前的發生衝突,不放心可以開乙個used陣列
最後輸出,312ms,不慢
#include
using
namespace
std;
const
int n = 1
<< 10 | 1;
int f[n][n][3]; // f[i][j][k] 表示上上行是 i, 上行是 j, 第 k 行取得的最大值
int g[n], v[n];
int o[101];// 每一行本身的限制
int tot = 0;
int n, m;
void dfs(int u, int now, int cur)
dfs(u + 1, now, cur);
dfs(u + 3, now + (1
<< (u - 1)), cur + 1);
}int main()
}dfs(1, 0, 0);
for(int i = 1; i <= tot; i++)
}for(int i = 2; i <= n; i++) }}
}int ans = 0;
for(int i = 1; i <= tot; i++) */
ans = max(ans, f[g[i]][g[j]][n % 3]);}}
printf("%d", ans);
return
0;}
Luogu P2704 NOI2001 炮兵陣地
司令部的將軍們打算在n m的網格地圖上部署他們的炮兵部隊。乙個n m的地圖由n行m列組成,地圖的每一格可能是山地 用 h 表示 也可能是平原 用 p 表示 如下圖。在每一格平原地形上最多可以布置一支炮兵部隊 山地上不能夠部署炮兵部隊 一支炮兵部隊在地圖上的攻擊範圍如圖中黑色區域所示 如果在地圖中的灰...
Luogu P2704 NOI2001 炮兵陣地
gate 還是狀壓dp.因為int開成bool了de了好久,最後還是wjh幫忙看出來的qaq f i k j 代表第i行,狀態為j,上一行狀態為k,上上行的狀態為kk 四重迴圈,保證j,k j,kk k,kk不衝突的前提下,有 f i k j max f i kk k sum j 因為狀態太多了存不...
luogu2704 狀壓DP 炮兵陣地
題目描述 司令部的將軍們打算在nm的網格地圖上部署他們的炮兵部隊。乙個nm的地圖由n行m列組成,地圖的每一格可能是山地 用 h 表示 也可能是平原 用 p 表示 如下圖。在每一格平原地形上最多可以布置一支炮兵部隊 山地上不能夠部署炮兵部隊 一支炮兵部隊在地圖上的攻擊範圍如圖中黑色區域所示 如果在地圖...