USACO Cow Pedigrees
2014-05-09 22:32
295 查看
题意是,有这样一种二叉树,每个节点的孩子数目不是0就是2,现在有N个节点,要组成一颗高度为K的这样的二叉树,问你有多少种组成方法。
理所当然的想到了DP,一开始想的方程是
f(i,j)为给你i 个节点,构成高度为j的这样的二叉树的种类数,转移的时候
f(i,j) = Σf(k1,h1)*f(k2,h2),其中k1+k2=i-1,max(h1,h2)=k
但是题目给的复杂度N是200,K是100,这样算来复杂度是N^2*K^2达到了4*10^8,显然超过了要求。
优化的过程我想了很久,最后想到一个利用前缀和来简化复杂度的方法。
设f(i,j)为给你i个节点,构成高度不大于j的这样的二叉树的种类数,转移的时候
f(i.j)=Σf(k1,j)*f(k2,j),其中k1+k2=i-1,这样子的话复杂度就变成了N^2*K,4*10^6,可以接受了。
o(╯□╰)o但是边界处理上面又花费了许多时间,首先因为j表示的是不小于高度j的,这样子的话无论i,j能否构成这样子的二叉树都要进行计算,然后f(1,x),x<=K全部要处理成1
另外做前缀和相减的时候别忘记加上MOD防止变成负数哦
理所当然的想到了DP,一开始想的方程是
f(i,j)为给你i 个节点,构成高度为j的这样的二叉树的种类数,转移的时候
f(i,j) = Σf(k1,h1)*f(k2,h2),其中k1+k2=i-1,max(h1,h2)=k
但是题目给的复杂度N是200,K是100,这样算来复杂度是N^2*K^2达到了4*10^8,显然超过了要求。
优化的过程我想了很久,最后想到一个利用前缀和来简化复杂度的方法。
设f(i,j)为给你i个节点,构成高度不大于j的这样的二叉树的种类数,转移的时候
f(i.j)=Σf(k1,j)*f(k2,j),其中k1+k2=i-1,这样子的话复杂度就变成了N^2*K,4*10^6,可以接受了。
o(╯□╰)o但是边界处理上面又花费了许多时间,首先因为j表示的是不小于高度j的,这样子的话无论i,j能否构成这样子的二叉树都要进行计算,然后f(1,x),x<=K全部要处理成1
另外做前缀和相减的时候别忘记加上MOD防止变成负数哦
/* ID: flsnnx1 LANG: C++ TASK: nocows */ #include <cstdio> #include <sstream> #include <fstream> #include <cstring> #include <iostream> #include <algorithm> #include <map> #include <cctype> #include <ctime> #include <set> #include <climits> #include <vector> #include <queue> #include <stack> #include <cstdlib> #include <cmath> #include <string> #include <list> #define INPUT_FILE "nocows.in" #define OUTPUT_FILE "nocows.out" using namespace std; typedef long long LL; const int INF = INT_MAX / 2; void setfile() { freopen(INPUT_FILE,"r",stdin); freopen(OUTPUT_FILE,"w",stdout); } const int maxn = 205; const int maxk = 105; const int MOD = 9901; int dp[maxn][maxk]; int main() { setfile(); int N,K; cin >> N >> K; for(int i = 1;i <= K;i++) dp[1][i] = 1; for(int i = 3;i <= N;i++) { for(int j = 2;j <= K;j++) { for(int k = 1;k < i - 1;k++) { LL adc = (dp[k][j - 1] % MOD) * (dp[i - 1 - k][j - 1]) % MOD; dp[i][j] += adc % MOD; dp[i][j] %= MOD; } } } cout << (dp [K] - dp [K - 1] + MOD) % 9901 << endl; return 0; }
相关文章推荐
- USACO: Cow Pedigrees dp
- usaco Cow Pedigrees
- USACO / Cow Pedigrees(DP)
- USACO Cow Pedigrees, DP经典入门讲解
- usaco Cow Pedigrees
- USACOTrainning.Cow Pedigrees
- usaco Cow Pedigrees
- usaco6.3.2 Cryptcowgraphy
- 3404: [Usaco2009 Open]Cow Digit Game又见数字游戏 (博弈论)
- 【BZOJ 1631】 [Usaco2007 Feb]Cow Party
- [U]Cow Pedigrees DP
- bzoj 1668: [Usaco2006 Oct]Cow Pie Treasures 馅饼里的财富【记忆化搜索+剪枝】
- bzoj 1654: [Usaco2006 Jan]The Cow Prom 奶牛舞会 -- Tarjan
- 【动态规划】bzoj1633 [Usaco2007 Feb]The Cow Lexicon 牛的词典
- 【强连通分量】Bzoj1654 [Usaco2006 Jan]The Cow Prom 奶牛舞会
- [USACO 2012OPEN] Balanced Cow Subsets(meet in the middle + DFS)
- bzoj1654: [Usaco2006 Jan]The Cow Prom 奶牛舞会
- bzoj:1654 [Usaco2006 Jan]The Cow Prom 奶牛舞会
- bzoj:3400 [Usaco2009 Mar]Cow Frisbee Team 奶牛沙盘队
- BZOJ 1633 [Usaco2007 Feb]The Cow Lexicon 牛的词典(单调DP)