Handshaking<DP>
链接:http://soj.me/show_problem.php?pid=1007&cid=969
| Input The input begins with a line containing an integer T (T<=1000), which indicates the number of test cases. The following T lines each contain an even number N (2<=N<=2000), indicating the number of persons. Output For each case, output the number of ways. The answer may be very large, so just output the remainder of the answer after divided by 1000000007. Sample Input  Copy sample input to clipboard 4 2 4 6 8 Sample Output 1 2 5 14 | 
题意:有N个人要互相握手, 问两两不相交叉有多少种
思路: dp题 dp[i] 表示i个人的种数;
枚举1和谁握手, 则可分为 i-2, 和 N-i 两部分
 View Code
View Code 
1 #include <iostream> 2 #include <cmath> 3 #include <cstring> 4 #include <cstdio> 5 #include <string> 6 #include <stdlib.h> 7 using namespace std; 8 const int Mod=1e9+7; 9 long long dp[2005]; 10 void Init( ) 11 { 12 memset( dp, 0, sizeof dp ); 13 dp[0]=1; dp[2]=1; 14 for( int i=4; i<=2001; i+=2 ) 15 for( int j=2; j<=i; ++j ){ 16 dp[i]+=(dp[j-2]*dp[i-j])%Mod; 17 dp[i]%=Mod; 18 } 19 } 20 int main( ) 21 { 22 Init( ); 23 int T, N; 24 scanf( "%d", &T ); 25 while( T -- ){ 26 scanf( "%d", &N ); 27 printf( "%lld\n", dp[N] ); 28 } 29 return 0; 30 }
 
                    
                     
                    
                 
                    
                

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号