搜尋+狀壓+dp。
注意到乙個性質:考慮一棵以x為根的子樹,在x到原樹的根的路徑上的點如果都已經確定了方案,那麼x的左右兒子的決策就彼此獨立,互不影響了。所以我們考慮狀壓一條路徑上每一層節點的狀態,求出dp[u][x] : 以u為根的子樹中分配x個作戰平民的最大收益是多少(注意因為是在dfs當中,所以dp陣列存的是在當前狀況下的最優解)。
**挺短的,可食用~
#include usingnamespace
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 後,左右兒子的貢獻的獨立的,然後左右兒子的選擇對上...