p1470_规划.cpp

来自「高手写的所有acm例程 在acm.zju.edu.cn 上的题目的例程」· C++ 代码 · 共 58 行

CPP
58
字号
#include <stdio.h>
#include <string.h>

#define MAXN      22

int     f [MAXN] [MAXN] [MAXN] , N , M;

void prepare ();

int  find ( int , int , int );
void solve ();

main ()
{
     prepare ();
     while ( scanf ( "%d%d" , &N , &M ) != EOF ) {
           solve ();
     }
}

void solve ()
{
     int   Sum = 0 , k;
     for ( k = N; k >= 0; k -- )
         Sum += find ( k , N , M );
     printf ( "%d\n" , Sum );
}

int  find ( int depth , int nodes , int leaves )
{
     if ( depth < 0 || nodes < leaves ) return 0;
     if ( f [depth] [nodes] [leaves] != -1 ) return f [depth] [nodes] [leaves];
     int  depthl , depthr , nodesl , nodesr , leavesl , leavesr , tl , tr;
     f [depth] [nodes] [leaves] = 0;
     for ( int i = 0; i < 2; i ++ )
         for ( int j = 0; j < 2; j ++ ) if ( !i || !j ) {
             depthl = depth - i - 1 , depthr = depth - j - 1;
             for ( nodesl = 0; nodesl < nodes; nodesl ++ )
                 for ( nodesr = nodes - nodesl - 1 , leavesl = 0; leavesl <= leaves; leavesl ++ ) {
                     leavesr = leaves - leavesl;
                     tl = find ( depthl , nodesl , leavesl );
                     tr = find ( depthr , nodesr , leavesr );
                     f [depth] [nodes] [leaves] += tl * tr;
                 }
         }
     return f [depth] [nodes] [leaves];
}

void    prepare ()
{
     memset ( f , 0xff , sizeof ( f ));
     for ( int i = 0; i < MAXN; i ++ )
         for ( int j = 0; j < MAXN; j ++ ) f [0] [i] [j] = 0;
     f [0] [0] [0] = 1;
     f [1] [1] [1] = 1;
     f [1] [1] [0] = 0;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?