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#includeview code#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;
}
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...