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

给出一个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);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值