題目出自尛焱轟眾所周知,樹是n 個節點n-1 條邊的結構,而所謂的優美的樹需要滿足如下條件:
1. 這是一棵有根二叉樹;
2. 非葉節點需有兩個兒子;
3. 不可以變換為k-左偏樹。
所謂的k-左偏樹是指一棵有k 個葉子的樹,每個非葉節點的右兒子均為葉子且均有左兒子。
所謂的變換指的是經過若干次如下兩種變換:
1. 刪去乙個節點的兩個兒子;
2. 用乙個節點的某個兒子替換該節點。
如下圖,若k=3 則這不是一棵優美的樹。
現在給你k 和n,想要你求出葉子數為1,2,3…n 的優美的樹分別有多少。
n,k<=5000
設 f[i][j] 表示有 n 葉子節點、向左深度最大為 j 的這種形態的樹的數量。
轉移就是列舉兩棵樹合併。
卡下常數好像能70分。
首先去掉那 n+1 個葉子節點,這樣就去掉了每個節點一定要有兩個兒子的限制。(woc我怎麼就想不到)
按先序遍歷的順序來dp。(woc我怎麼就想不到×2)
設 f[i][j] 表示先序遍歷到了第 i 個節點,從 1 到 i 的向左深度為 j,的方案數。轉移就是列舉下乙個點放哪,可以放自己的左兒子,也可以放祖先(包括)的右兒子。
有多少祖先缺右兒子呢?其實,我們向左走了 j 步,就相當於有 j 個祖先缺右兒子。(woc我怎麼就想不到×3)
#include
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
typedef long long ll;
const int maxn=5005;
const ll mo=1e9+9;
int n,k;
ll f[maxn][maxn],g[maxn][maxn];
int main()
printf("1\n");
fo(i,1,n) printf("%lld\n",g[i][1]);
}
WC2017模擬1 2總結
這兩天幾乎都墊底。做這種模擬最大的感覺就是 智商完全不夠用啊 也是,我乙個連進省隊都很危險的菜雞,做這種模擬,智商肯定不夠。幸好這兩場所用的知識點還在我範圍內,不然就更加不可做了。對於我這等小弱雞,wc必須打暴力啊。但是我的暴力能力好像不怎麼好。主要有兩個問題。一是暴力老是打掛。可能是迴圈變數,可能...
WC2017遊記 能力殘廢康復計畫
懶癌晚期的蒟蒻一年多沒有更blog了 這次冬眠營去紹一省好好地遊玩了一番,體驗了一段時間的豪華自助餐,成功吃胖 第一課堂的東西基本還是沒吸收 聽著覺得有點道理,結果過幾分鐘就忘了 可能最大的收穫就是 又 體會到自己太弱了 於是變成了吃飯冬眠旅遊營 順便 松爺真是太強辣 我多年卡常可能卡的是假常數 排...
四校聯考 20171001
二分 期望得分 70 實際得分 10 列舉最高的高度可能為多少 二分。o logm 列舉最高高度應該位於哪一列上.o n 左右擴散列舉出需要用的積木總數,與m相比較。容易發現合法的高度的最高值,最終需要搭建乙個金字塔。1,3,5,7 正解是預處理出每一列作為最高列的左右邊界。然後再二分最大高度。ch...