luogu2704 NOI2001 炮兵陣地

2021-08-18 20:07:12 字數 1031 閱讀 5663

題目鏈結

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