題解 JLOI2015戰爭排程

2022-02-27 13:42:44 字數 1194 閱讀 8425

搜尋+狀壓+dp。

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

**挺短的,可食用~

#include using

namespace

std;

#define maxn 1025

intn, m, tot, ans, dp[maxn][maxn];

int w[maxn][20], f[maxn][20

];int

read()

while(c >= '

0' && c <= '

9') x = x * 10 + c - '

0', c =getchar();

return x *k;

}void dfs(int x, int y, int st, int

cnt)

dfs(x

<< 1, y + 1, st | (1

<< y), cnt >> 1

); dfs(x

<< 1 | 1, y + 1, st | (1

<< y), cnt >> 1

);

for(int i = cnt >> 1; ~i; i --)

for(int j = cnt >> 1; ~j; j --)

dp[x][i + j] = max(dp[x][i + j], dp[x << 1][i] + dp[x << 1 | 1

][j]);

dfs(x

<< 1, y + 1, st, cnt >> 1

); dfs(x

<< 1 | 1, y + 1, st, cnt >> 1

);

for(int i = cnt >> 1; ~i; i --)

for(int j = cnt >> 1; ~j; j --)

dp[x][i + j] = max(dp[x][i + j], dp[x << 1][i] + dp[x << 1 | 1

][j]);

}int

main()

JLOI2015 戰爭排程

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

JLOI2015 戰爭排程 war

一開始看這題,毫無頭緒 不過發現n十分的小,最多只有10,想一想暴搜加優化。先試著打了打暴搜,從上往下列舉狀態,然後搜尋到子節點的時候,再統計答案,每個父節點的答案是兩個子節點答案的和,dfs x,y,z 表示當前搜到的點二進位制狀態為x,從根節點到底層打仗的狀態為y,然後此時要打仗的人有z個。然後...

JLOI2015 戰爭排程 解題報告

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