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