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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LightOJ 1005 Rooks(组合排列)或(dp,还得再看看)相关的知识,希望对你有一定的参考价值。

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,还得再看看)的主要内容,如果未能解决你的问题,请参考以下文章

LightOJ - 1005 - Rooks(组合数)

Lightoj 1005 Rooks(DP)

Light oj 1005 - Rooks (找规律)

(light OJ 1005) Rooks dp

LightOJ-1005 组合数学,组合数水题

nth Permutation LightOJ - 1060