哪位了解重复拉丁矩阵问题的算法的?进来解说下~
重复拉丁矩阵问题
问题描述:
现有k种不同价值的宝石,每种宝石都有足够多颗。欲将这些宝石排列成一个m行n列的矩阵,m≤n,使矩阵中每一行和每一列的同一种宝石数都不超过规定的数量。另外还规定,宝石阵列的第1 行从左到右和第1 列从上到下的宝石按宝石的价值最小字典序从小到大排列。设计一个算法,对于给定的k,m和n以及每种宝石的规定数量,计算出有多少种不同的宝石排列方案。
编程任务:
对于给定的m,n和k,以及每种宝石的规定数量,计算出不同的宝石排列方案数。
数据输入:
由“测试数据”文件夹中对应的输入文件给出输入数据。第1行有3个正整数m,n和k,0<m≤n<9。第2 行有k个数,第j个数表示第j种宝石在矩阵的每行和每列出现的最多次数。这k个数按照宝石的价值从小到大排列。设这k个数为1≤v1 ≤v2 ≤……≤vk ,则v1+ v2+……+ vk =n。
Input
4 7 3
2 2 3
Output
84309
大家帮帮忙,来给个解法,思路吧~~
(这些天都在做算法题,碰了不少壁,无奈了~~)
谢谢了~~
[解决办法]
拉丁矩阵精确解目前只能搜索~
[解决办法]
试了几个递推,都不太理想,复杂度还挺高的,比搜索也好不到哪里去,从本题的规模来看,
似乎可以靠硬搜来解决,以题目给出的例子来看可以先生成符合条件的一行,7!/2!/3!/2! = 210种
在这210种里面,利用DLX来排放,可以提高不少效率(主要是剪枝)