[关闭]
@WangYixu 2018-06-24T13:37:30.000000Z 字数 871 阅读 669

[LgP1472]奶牛家谱

OI 题解 DP

算法:DP

这个题显然是一个dp,我们考虑一棵树,深度为d,大小为s,可以把它分成三部分:根节点,左子树,右子树。而且,两个子树中必有一个深度为d-1,而且,我们可以看到,当左右子树只有一棵深度为d-1时,是对称的,所以,我们可以推出:

但是,这还是太慢了!
仔细观察我们可以发现,内层的sum可以用前缀和优化!
所以:

这样就可以过了!

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<iostream>
  5. using namespace std;
  6. const int N = 200 + 5, K = 100 + 5, MOD = 9901;
  7. int f[K][N], g[K][N], n, k;
  8. int main() {
  9. cin >> n >> k;
  10. f[1][1] = 1;
  11. for(int i = 1; i <= k; ++ i) {
  12. g[i][1] = 1;
  13. }
  14. int s;
  15. for(int i = 2; i <= k; ++ i) {
  16. s = (1 << i) - 1;
  17. for(int j = 3; j <= n; ++ j) {
  18. for(int l = j - 1; l > 0; -- l) {
  19. // for(int d = 1; d < i - 1; ++ d) {
  20. // f[i][j] = (f[i][j] + f[i - 1][l] * f[d][j - l - 1] * 2 % MOD) % MOD ;
  21. // }
  22. f[i][j] = (f[i][j] + f[i - 1][l] * g[i - 2][j - l - 1] * 2 % MOD) % MOD;
  23. f[i][j] = (f[i][j] + f[i - 1][l] * f[i - 1][j - l - 1] % MOD) % MOD;
  24. }
  25. g[i][j] = (g[i - 1][j] + f[i][j]) % MOD;
  26. }
  27. }
  28. cout << f[k][n] << endl;
  29. return 0;
  30. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注