给出一个n行的矩阵,每一行有a[i]个数,总共有sum个数,要求每一个位置的数必须比上面的数和左面的数大,求总方案数.
杨氏矩阵又叫杨氏图表,它是这样一个矩阵,满足条件:
(1)如果格子(i,j)没有元素,则它右边和上边的相邻格子也一定没有元素。
(2)如果格子(i,j)有元素a[i][j],则它右边和上边的相邻格子要么没有元素,要么有元素且比a[i][j]大。
下面介绍一个公式,那就是著名的钩子公式。
对于给定形状,不同的杨氏矩阵的个数为:n!/(每个格子的钩子长度加1的积)。
其中钩子长度定义为该格子右边的格子数和它上边的格子数之和。
POJ 1825/2279
import java.io.*;
import java.util.*;
import java.math.*;
public class Main
{
static BigInteger jie[] = new BigInteger[1000];
public static void main(String args[])
{
Scanner cin = new Scanner(System.in);
int n;
jie[0]=BigInteger.ONE;
for(int i=1;i<=20*12;i++) jie[i]=jie[i-1].multiply(BigInteger.valueOf(i));
while(cin.hasNextInt())
{
int a[] = new int[1000];
n = cin.nextInt();
if (n==0)break;
BigInteger ans = BigInteger.ONE;
int t=0;
for(int i=1;i<=n;i++) {a[i]=cin.nextInt();t+=a[i];}
for(int i=1;i<=n/2;i++) {
int p=a[i];
a[i]=a[n-i+1];
a[n-i+1]=p;
}
ans=jie[t];
for(int i=1;i<=n;i++)
for(int j=1;j<=a[i];j++) {
int l=a[i]-j;
int p=i-1;
while(p>0&&a[p]>=j) {
l++;p--;
if(p==0) break;
}
//` System.out.println(l+1);i
ans=ans.divide(BigInteger.valueOf(l+1));
}
System.out.println(ans);
}
}
}