POJ 1825/2279(Young/Mr. Young's Picture Permutations-杨氏矩阵和钩子公式)

来源:互联网 发布:乔布斯是编程天才吗 编辑:程序博客网 时间:2024/05/22 04:28

给出一个n行的矩阵,每一行有a[i]个数,总共有sum个数,要求每一个位置的数必须比上面的数和左面的数大,求总方案数.

转自acdreamers
杨氏矩阵又叫杨氏图表,它是这样一个矩阵,满足条件:
(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);        }    }}