/*
考虑二维的状况:
如果 A>=B 则在 F( A-1, B )后面放上A,在F(A,B-1)后面放上B
F( A, B ) = F( A, B-1 ) + F( A-1, B ) { A > B }
当 A = B 时 也满足 F( A, B ) = F( A, B-1 ) + F( A-1, B )
= F( A, B-1 ) + 0
所以有: F( A, B ) = F( A, B-1 ) + F( A-1, B ) { A >= B }
考虑三维的状况:
F( A,B, C ) = F( A-1, B, C ) + F( A, B-1, C-1 ) + F( A, B , C-1 ) {A >= B >= C}
*/
![ContractedBlock.gif](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![ExpandedBlockStart.gif](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 #include <stdio.h>
2 #include <string.h>
3
4 char ABC[ 61 ][ 61 ][ 61 ][ 82 ];
5
6 int main()
7 {
8 memset( ABC, 0, sizeof( ABC ) );
9 for ( int A = 1 ; A <= 60 ; ++ A )
10 ABC[ A ][ 0 ][ 0 ][ 0 ] = 1;
11
12 for ( int A = 1 ; A <= 60 ; ++ A )
13 for ( int B = 1 ; B <= 60 ; ++ B )
14 if ( A >= B )
15 for ( int k = 0 ; k <= 80 ; ++ k ) {
16 ABC[ A ][ B ][ 0 ][ k ] += ABC[ A-1 ][ B ][ 0 ][ k ] + ABC[ A ][ B-1 ][ 0 ][ k ];
17 if ( ABC[ A ][ B ][ 0 ][ k ] > 9 ) {
18 ABC[ A ][ B ][ 0 ][ k+1 ] += ABC[ A ][ B ][ 0 ][ k ]/10;
19 ABC[ A ][ B ][ 0 ][ k ] %= 10;
20 }
21 }
22
23 for ( int A = 1 ; A <= 60 ; ++ A )
24 for ( int B = 1 ; B <= 60 ; ++ B )
25 for ( int C = 1 ; C <= 60 ; ++ C )
26 if ( A >= B && B >= C )
27 for ( int k = 0 ; k <= 80 ; ++ k ) {
28 ABC[ A ][ B ][ C ][ k ] += ABC[ A-1 ][ B ][ C ][ k ] + ABC[ A ][ B-1 ][ C ][ k ] + ABC[ A ][ B ][ C-1 ][ k ];
29 if ( ABC[ A ][ B ][ C ][ k ] > 9 ) {
30 ABC[ A ][ B ][ C ][ k+1 ] += ABC[ A ][ B ][ C ][ k ]/10;
31 ABC[ A ][ B ][ C ][ k ] %= 10;
32 }
33 }
34
35 int n;
36 while ( scanf("%d",&n) != EOF ) {
37 int start = 80;
38 while ( !ABC[ n ][ n ][ n ][ start ] && start > 0 ) -- start;
39 while ( start >= 0 )
40 printf("%d",ABC[ n ][ n ][ n ][ start -- ]);
41 printf("\n\n");
42 }
43 return 0;
44 }