medie2005 发表于 2009-7-27 13:45:50

一个简单的计数问题

十六个不同高度的人前后排成四排,每排四人,要求后面的比前面高,左边的比右边的高,问你有几种排法?

到处瞎逛 发表于 2009-7-27 14:22:29

如果有这样的两个要求的话,估计只有一种排列方法。

nlrte13 发表于 2009-7-27 14:25:50

............................
4个数两排,就有2种排列了

nlrte13 发表于 2009-7-27 14:39:43

本帖最后由 nlrte13 于 2009-7-27 14:55 编辑

我算的结果是 24024 种排列

nlrte13 发表于 2009-7-27 15:02:54

14 * 13 * 12 * 11

nlrte13 发表于 2009-7-27 15:14:38

2*2的方块有 2*1 种
3*3的有 7*6种
4*4的有 14*13*12*11种
5*5的有 23*22*21*20种
6*6的有 34*33*32*31*30*29种
…………

数学星空 发表于 2009-7-27 16:42:27

本帖最后由 数学星空 于 2009-7-27 16:44 编辑

6# nlrte13

不知是否是编程计算出来的??
若计算无误,通过观察可得到(设f(n)为满足上题条件的n*n方阵数目)
f(2n)=prod_{k=0}^{2n-1}(4n^2-2n-1+k)
f(2n+1)=prod_{k=0}^{2n-1}(4n^2+2n+k)

mathe 发表于 2009-7-27 16:51:10

http://www.research.att.com/~njas/sequences/?q=2%2C42%2C24024&sort=0&fmt=0&language=english
#include <map>
using namespace std;
#define M 5
class key{
    int d;
public:
    key(int v){
      int i;
      for(i=0;i<M;i++)d=v;///non-increasing sequence required.
    }
    bool operator<(const key& k)const{
      int i;
      for(i=0;i<M;i++){
            if(d<k.d)return true;
            if(d>k.d)return false;
      }
      return false;
    }
    bool operator==(const key& k)const{
      int i;
      for(i=0;i<M;i++){
            if(d!=k.d)
                return false;
      }
      return true;
    }
    const int *getData()const{return d;}
};

map<key, long long> the_map;

long long calc(int d)
{
    int e;
    map<key, long long>::iterator it;
    it=the_map.find(d);
    long long c;
    if(it==the_map.end()){
      int i;
      for(i=0;i<M;i++){
            e=d;
      }
      c=0;
      for(i=0;i<M-1;i++){
            if(e<e){
                e--;
                c+=calc(e);
                e++;
            }
      }
      if(e>0){
            e--;
            c+=calc(e);
            e++;
      }
      the_map.insert(pair<key,long long>(d,c));
    }else{
      c=it->second;
    }
    return c;
}

int _tmain(int argc, _TCHAR* argv[])
{
    int d;
    int i;
    d=1;
    for(i=1;i<M;i++)d=0;
    the_map=1LL;
    for(i=0;i<M;i++)d=M;
    printf("%lld\n",calc(d));
        return 0;
}

数学星空 发表于 2009-7-27 17:25:46

本帖最后由 数学星空 于 2009-7-27 17:33 编辑

呵呵,真不可思议,表达式太复杂了
f(n)={(n^2)!}/{prod_{k=1}^{2n-1}k^(n-|n-k|)}

nlrte13 发表于 2009-7-27 17:51:27

呵呵,真不可思议,表达式太复杂了
f(n)={(n^2)!}/{prod_{k=1}^{2n-1}k^(n-|n-k|)}
数学星空 发表于 2009-7-27 17:25 http://bbs.emath.ac.cn/images/common/back.gif

咳。。。你真能搞 - -#
我发现我的算式不对^^
不过4*4的结果还是对的,哈哈
页: [1] 2
查看完整版本: 一个简单的计数问题