码迷,mamicode.com
首页 > 其他好文 > 详细

LightOJ 1005 Rooks(组合排列)或(dp,还得再看看)

时间:2016-03-19 19:25:08      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:

n*n的棋盘中,放k个棋子,每个棋子不能同行同列

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<queue>
 4 #include<string>
 5 #include<math.h>
 6 #include<stack>
 7 #include<cstdlib>
 8 #include<set>
 9 #include<map>
10 #include<cstring>
11 #include<vector>
12 #include<algorithm>
13 #include<cctype>
14 #include<sstream>
15 
16 const double PI = acos(-1.0);
17 typedef long long ll;
18 using namespace std; 
19 /*
20     输入n,k
21     k个格子放在n*n 
22 1.    dp[n][k] :表示n*n格子中放k种的方法 
23      dp[i][0] = 1 ,  dp[i][1] = i * i; 
24      
25      // 放了一个格子后 剩下的是 dp[i-1][j-1],再除去重复的 
26             // i*i任意放一个位置 
27             dp[i][j] =i*i*dp[i-1][j-1]/j;
28      
29 2.组合排列  选出 k 列 C(n,k);
30   ------         k 列中第一个棋子能放3个位置,第二个棋子2个位子 A(n,k); 
31   ------
32   ------ 
33 
34 */
35 ll dp[31][31];
36 void init(){
37     memset(dp,0,sizeof(dp)); // k>n时 dp[n][k]=0 
38     for(int i = 1 ; i < 31 ; i ++){
39         dp[i][0] = 1;
40         dp[i][1] = i*i;
41     }
42     for(int i = 2 ; i < 31 ; i ++){
43         for(int j = 2 ; j <= i ; j ++){
44             // 放了一个格子后 剩下的是 dp[i-1][j-1],再除去重复的 
45             // i*i任意放一个位置 
46             dp[i][j] =i*i*dp[i-1][j-1]/j;
47         }
48     }
49     
50 }
51 int main(){
52     init();
53     int T,kase=1;
54     scanf("%d",&T);
55     while(T--){
56         int n,k;
57         cin >> n >> k;
58         if(k>n) printf("Case %d: %lld\n",kase++,0ll);
59         else    printf("Case %d: %lld\n",kase++,dp[n][k]);
60     }
61     return 0;
62 }

 

LightOJ 1005 Rooks(组合排列)或(dp,还得再看看)

标签:

原文地址:http://www.cnblogs.com/zstu-jack/p/5295846.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!