Luogu P2704 NOI2001 炮兵陣地

2022-04-08 02:08:23 字數 1090 閱讀 4728

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])

因為狀態太多了存不下,所以只要把可行的狀態記錄下來,也就是說離散化一下w

據說還可以用滾動陣列,只記錄兩行的(f[i%2][j][k])不過空間反正足夠了

前兩行初始化要稍微注意下。

一點以後可能有用的優化:

1.這個題「只能放在平原上,不能放在山地上」,我原來是寫完全包含(g[j]|a[i]) == a[i]

後來看題解a[i]存的是山地的位置,也就是  !(g[j]&a[i])

2.這個題是橫著比較短而豎著比較長而爆空間的…

如果遇到豎著短橫著長的情況,不妨把它旋轉一下。這樣列舉狀態的迴圈就會變得短一些!

**如下

#include#include

#include

#include

#define mogeko qwq

using

namespace

std;

char s[15

];int

n,m,ans,cnt;

int a[1

<<11],sum[70],f[105][70][70],g[70

];int

main()

for(int i = 0; i < (1

for(int i = 1; i <= cnt; i++)

for(int j = 1; j <= cnt; j++)

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

for(int j = 1; j <= cnt; j++)

}printf(

"%d\n

",ans);

return0;

}

view code

Luogu P2704 NOI2001 炮兵陣地

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

luogu2704 NOI2001 炮兵陣地

題目鏈結 因為m 10,考慮狀壓dp 先dfs搜出所有可能狀態 f i j k 表示上上行是 i,上行是 j,第 k 行取得的最大值 但如果直接開滿陣列,mle 考慮滾動陣列 此題只需保留2個狀態,上上行,上行 所以用四層迴圈列舉 超時 考慮剪枝 放進上上行時先與題述條件對比 放入上行是與上上行和題...

NOI 2704 尋找平面上的極大點

題意 根據提示,只有位於單獨顏色上的點或者說只有右上角的點才是極大點,所以我對每乙個點與x和y軸組成的矩形進行標記,將其中每個點的標記值 最後只有標記值為1的點,才是我們要找的點 include include include include include include using namesp...