作為乙個刷題的萌新來說,這題簡直太難了。
從網上看了大佬的部落格,看了好久(參考部落格連線在文末)。
這道題結合了深搜和dp。
從題目裡我還學到了用位移位運算的方便快捷。>> <<
從大佬的部落格中,我學習到:對於葉子結點來說,當祖先結點的狀態確定時,根據貢獻值,他參戰與否就能確定。那麼我們從根結點到葉節點深搜,每向葉節點靠近一層,就確定當前這個結點的狀態。當達到葉結點時,根據祖先結點的狀態,就能確定他參戰或是後勤的總貢獻。在回溯時,每回溯一層,求得當前結點為根時,不同葉子參戰數的貢獻值。
#include #include int war[1024][10];
int farm[1024][10];
int node=0;//子結點的數量
int state;//上層節點的狀態
int dp[1024][513];
int n,m;
void dfs(int x);
int max(int a,int b);
int main()
void dfs(int x)else
}return;
}node>>=1;
state<<=1;//當前不參戰
dfs(x<<1);
dfs(x<<1|1);
for(j=0;j<=node;j++)
}state|=1;//當前參戰
dfs(x<<1);
dfs(x<<1|1);
for(j=0;j<=node;j++)
}state>>=1;
node<<=1;
}int max(int a,int b)
參考部落格: JLOI2015 戰爭排程
記憶體限制 256 mib 時間限制 1000 ms 標準輸入輸出 題目型別 傳統 評測方式 文字比較 臉哥最近來到了乙個神奇的王國,王國裡的公民每個公民有兩個下屬或者沒有下屬,這種關係剛好組成乙個 n 層的完全二叉樹。公民 i 的下屬是 2i 和 2i 1 最下層的公民即葉子節點的公民是平民,平民...
JLOI2015 戰爭排程 war
一開始看這題,毫無頭緒 不過發現n十分的小,最多只有10,想一想暴搜加優化。先試著打了打暴搜,從上往下列舉狀態,然後搜尋到子節點的時候,再統計答案,每個父節點的答案是兩個子節點答案的和,dfs x,y,z 表示當前搜到的點二進位制狀態為x,從根節點到底層打仗的狀態為y,然後此時要打仗的人有z個。然後...
題解 JLOI2015戰爭排程
搜尋 狀壓 dp。注意到乙個性質 考慮一棵以x為根的子樹,在x到原樹的根的路徑上的點如果都已經確定了方案,那麼x的左右兒子的決策就彼此獨立,互不影響了。所以我們考慮狀壓一條路徑上每一層節點的狀態,求出dp u x 以u為根的子樹中分配x個作戰平民的最大收益是多少 注意因為是在dfs當中,所以dp陣列...