JLOI2015 戰爭排程 war

2021-07-14 09:00:20 字數 1035 閱讀 9197

一開始看這題,毫無頭緒……

不過發現n十分的小,最多只有10,想一想暴搜加優化。

先試著打了打暴搜,從上往下列舉狀態,然後搜尋到子節點的時候,再統計答案,每個父節點的答案是兩個子節點答案的和,dfs(x,y,z)表示當前搜到的點二進位制狀態為x,從根節點到底層打仗的狀態為y,然後此時要打仗的人有z個。

然後這樣十分的慢……

啟發式搜尋

看起來名字很高階,其實就是狀態標記。用f[x][y][z]來標記當前的狀態,假如已經搜尋過就直接返回答案。

但是空間會爆怎麼辦。

有乙個很犀利的東西,c++三元陣列合併為二元。

用這種方法就可以過了。

其他優化

這些很多啦,比如說當前這棵子樹的大小小於z就跳過……

#include

#include

#include

#include

#include

#include

#define fo(i,a,b) for(i=a;i<=b;i++)

#define fod(i,a,b) for(i=a;i>=b;i--)

using

namespace

std;

typedef pairp;

const

int maxn=1207;

int i,j,k,l,t,n,m,ans;

int a[maxn*2][maxn],b[maxn*2][maxn];

int d[maxn],s[maxn*2];

mapint>h[maxn];

int dfs(int x,int y,int z)

return j;

}fo(i,0,z)

return j;

}int main()

JLOI2015 戰爭排程

記憶體限制 256 mib 時間限制 1000 ms 標準輸入輸出 題目型別 傳統 評測方式 文字比較 臉哥最近來到了乙個神奇的王國,王國裡的公民每個公民有兩個下屬或者沒有下屬,這種關係剛好組成乙個 n 層的完全二叉樹。公民 i 的下屬是 2i 和 2i 1 最下層的公民即葉子節點的公民是平民,平民...

題解 JLOI2015戰爭排程

搜尋 狀壓 dp。注意到乙個性質 考慮一棵以x為根的子樹,在x到原樹的根的路徑上的點如果都已經確定了方案,那麼x的左右兒子的決策就彼此獨立,互不影響了。所以我們考慮狀壓一條路徑上每一層節點的狀態,求出dp u x 以u為根的子樹中分配x個作戰平民的最大收益是多少 注意因為是在dfs當中,所以dp陣列...

JLOI2015 戰爭排程 解題報告

感覺一到晚上大腦就宕機了.題目本身不難,就算沒接觸過想想也是可以想到的 這個滿二叉樹的深度很淺啊,每個點只會和它的 n 1 個祖先匹配啊 於是可以暴力列舉祖先鏈的選擇 然後處理某個點 i 時,已經列舉了 i 到根的祖先的選擇 這時候我們發現列舉 i 後,左右兒子的貢獻的獨立的,然後左右兒子的選擇對上...