zoukankan      html  css  js  c++  java
  • UASCO Cow Pedigrees /// oj10140

    题目大意:

    输入n,m ;二叉树

    输出 n个点分为m层 的方案数; 每个点的分支要么是0要么是2

    Sample Input

    5 3

    Sample Output

    2

    即 两个方案为
             O                     O
            /                      /   
          O    O     和      O    O
         /                             /   
       O    O                     O    O
     
     
    关于 dp[ i ][ j ] = dp[ i ][ j ] + dp[ i-1-k ][ j-1 ] * dp[ k ][ j-1 ]  
    可以这样理解,i 个点分为 j 层时
    先取出一个点做根节点为第一层 剩下 i-1 个点则分为左右两大支
    则此时 i-1 个点被分为两大支,且每支应分为 j-1 层 
    则 (i-1-k 分为 j-1 层的方案)*(k 分为 j-1 层的方案)= i 分为 j 层的方案
     
     
     
     
    #include <bits/stdc++.h>
    #define MOD 9901
    using namespace std;
    int dp[210][110];
    int main() {
        int n,m;
        while(~scanf("%d%d",&n,&m))
        {
            memset(dp,0,sizeof(dp));
            for(int j=1;j<=m;j++)
                for(int i=1;i<=n;i+=2)
                {
                    if(i==1) dp[i][j]=1;
                    for(int k=1;k<=i-2;k+=2)
                        dp[i][j]=(dp[i][j]+dp[i-1-k][j-1]*dp[k][j-1])%MOD;
                }
            printf("%d
    ",(dp[n][m]-dp[n][m-1]+MOD)%MOD);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    setTimeout详解
    【康娜的线段树】
    【[CQOI2016]手机号码】
    【[IOI2014]Wall 砖墙】
    【[1007]梦美与线段树】
    【[POI2010]ANT-Antisymmetry】
    【[HEOI2016/TJOI2016]排序】
    【[SCOI2016]背单词】
    【[HNOI2008]GT考试】
    【[JSOI2007]建筑抢修】
  • 原文地址:https://www.cnblogs.com/zquzjx/p/9053750.html
Copyright © 2011-2022 走看看