• USACO Cow Pedigrees


    题意是,有这样一种二叉树,每个节点的孩子数目不是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防止变成负数哦

    /*
    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[N][K] - dp[N][K - 1] + MOD) % 9901 << endl;
    	return 0;
    }
    

      

  • 相关阅读:
    如何通过地址转换为WGS经纬度
    Oracle动态创建时间分区,以及Oracle12c中快速创建自增列
    asp.net微信jsapi支付
    asp.net关于如何准许api跨域访问
    ajax调用天气接口
    git补充(命令)转自https://github.com/Wasdns/github-example-repo
    git补充(关于pull request)转自知乎
    Linux基础笔记
    git前期准备
    MVC设计模式
  • 原文地址:https://www.cnblogs.com/rolight/p/3719746.html
Copyright © 2020-2023  润新知