编程擂台系列之一:最小元素最大的九元组合
mathematica吧
全部回复
仅看楼主
level 2
waynebuaa 楼主
本人曾经是Mathematica老手,每次下载Mathematica新版本,总能在贴吧里快速找到资源,为了回馈贴吧,特开一个编程系列,旨在切磋交流。
已知一个9×9的矩阵,如下图,请在矩阵中找出9个数,构成集合,使得最小元素最大,且集合内的元素既不同行,也不同列。
为方便大家输入,已经粘贴如下:
{{82, 9, 74, 45, 63, 84, 75, 32, 83}, {41, 84, 61, 12, 33, 6, 92, 84, 11}, {60, 76, 84, 22, 40, 71, 62, 72, 66}, {41, 18, 19, 19, 75, 53, 20, 76, 36}, {44, 77, 82, 82, 74, 100, 20, 69, 99}, {11, 87, 100, 73, 84, 9, 42, 78, 28}, {18, 80, 56, 27, 73, 32, 25, 29, 2}, {26, 57, 85, 71, 42, 34, 22, 15, 13}, {100, 36, 92, 65, 36, 32, 42, 5, 91}}
2016年01月27日 04点01分 1
level 13
使得最小元素最大?啥意思
2016年01月27日 05点01分 2
理解一下这个就知道了:MaximalBy[{{8, 1, 6}, {3, 5, 7}, {4, 9, 2}}, Min]
2016年01月30日 08点01分
吧务
level 12
系列这个想法给赞[真棒],坐等楼主继续出题
这题类似PE345的感觉,不过9*9实在没啥挑战性啊,直接暴力穷举都是秒出,不如改大点吧[滑稽]
In[30]:= AbsoluteTiming[
list = Table[mat[[i, #[[i]]]], {i, 9}] & /@ Permutations[Range[9]];
pos = Ordering[Min /@ list, -1];
{#, Min@#} &@list[[pos]]
]
Out[30]= {0.230176, {{{83, 92, 76, 76, 100, 73, 73, 85, 100}}, 73}}
2016年01月27日 05点01分 3
东瓜好快……
2016年01月27日 05点01分
你的全排列很吃内存,再大恐怕就抗不住了,^_^
2016年01月27日 07点01分
吧务
level 12
再大肯定就不用全排列了啊,比如写个dp
In[4]:= mat = {{82, 9, 74, 45, 63, 84, 75, 32, 83}, {41, 84, 61, 12,
33, 6, 92, 84, 11}, {60, 76, 84, 22, 40, 71, 62, 72, 66}, {41, 18,
19, 19, 75, 53, 20, 76, 36}, {44, 77, 82, 82, 74, 100, 20, 69,
99}, {11, 87, 100, 73, 84, 9, 42, 78, 28}, {18, 80, 56, 27, 73,
32, 25, 29, 2}, {26, 57, 85, 71, 42, 34, 22, 15, 13}, {100, 36,
92, 65, 36, 32, 42, 5, 91}};
findMax[mat_] := Module[{n = Length@mat, max},
max[1, colUsedIndex_] :=
mat[[1, Position[colUsedIndex, 1][[1, 1]]]];
Do[max[row, colUsedIndex] =
Max@Table[
Min[mat[[row, i]],
max[row - 1, ReplacePart[colUsedIndex, i -> 0]]], {i,
Flatten@Position[colUsedIndex, 1]}], {row, 2,
n}, {colUsedIndex,
Permutations[
ConstantArray[1, row]~Join~ConstantArray[0, n - row]]}];
max[n, ConstantArray[1, n]]
];
findMax[mat] // AbsoluteTiming
Out[6]= {0.015001, 73}
基本是学着PE345讨论区的前两个代码写的,只不过把里面的数换成了列表。这样肯定是比用数+位运算慢不少,但我对位运算还不太熟悉看着一堆Bit比较蛋疼,所以慢点就慢点了。。。。。
这样写的话复杂度是O(n^2*2^n),15*15的矩阵也能在2s内出来。
话说楼主赶快出新题啊~
2016年01月27日 09点01分 4
回复
妙谛莲花
:毕竟放假在家没事干[滑稽]
2016年01月27日 09点01分
答案有两个的
2016年01月27日 14点01分
不过,还是值得赞一下
2016年01月27日 14点01分
@waynebuaa 答案有两个是什么意思?要是指最小值的话只能有73这一个,要是指得到73的选取方法的话一共有三种,实在没想明白两个是怎么算出来的。。。。。
2016年01月27日 15点01分
level 13
使得最小元素最大
完全看不懂这句话啥意思
——来自 贴吧客户端 For Windows10
2016年01月27日 10点01分 6
理解一下这个就知道了:MaximalBy[{{8, 1, 6}, {3, 5, 7}, {4, 9, 2}}, Min]
2016年01月30日 08点01分
level 10
想法很好啊!
2016年01月30日 00点01分 10
吧务
level 7
Do[MinMaxPart[{n}] = {{n, 1}}, {n, 9}];
Do[PositionToData[{i, j}] = mat[[i, j]], {i, 9}, {j, 9}];
MinFirst[list_, e_] :=
If[PositionToData[list[[1]]] < PositionToData[e], Append[list, e],
Prepend[list, e]];
MinMaxPart[list_] :=
MinMaxPart[list] =
Block[{l = Length[list]},
MaximalBy[
Table[MinFirst[
MinMaxPart[Complement[list, {list[[i]]}]], {list[[i]],
l}], {i, l}], PositionToData[#1[[1]]] &]][[1]];
MinMaxPart[Range[9]]
2016年01月31日 16点01分 13
level 6
应该是比较简短的解法 (53 bytes),并不很快。其中 m 是那个矩阵。
Last@Sort[{mat[[
#]]~Tr~Min,#
}&/@Permutations@Range@9]
(* answer: {73,{9,3,8,6,7,5,2,4,1}} *)
2016年02月01日 02点02分 14
[大拇指]
2016年02月01日 05点02分
level 3
很简单的哦,
2016年02月07日 06点02分 15
level 6
八皇后问题的变形?
2016年02月08日 13点02分 16
1