在网上找了半天也没找到一个Depot很优秀的解法,而我无意间发现了它的数学公式!
我又想了挺长时间想到了它的证明:
定义一个young Tableau的删除:
删除只限定对钩子长为0的元素:
让该元素离开young Tableau并在下一行中从右至左查找第一个比它小的元素,替换该元素,并在下一行对
查找到的元素重复上述操作,直到最后一行 例:
3 | ||
2 | 6 | |
1 | 4 | 5 |
3 | ||
2 | ||
1 | 4 | 5 |
3 | ||
2 | ||
1 | 4 | 6 |
你可以轻易地发现和证明删除后的young Tableau形状为直接删除该元素的形状(好像没用,实际有用);
此外,你也可以发现将最终删除的元素重新插入将得到原young tableau;
反复执行上述删除,按最终删除元素逆序排列,按该排列进行题述插入,你可以得到原young Tableau;(容易证明)
例,一个删除所得到的序列为:5 1 6 2 4 3,逆序: 3 4 2 6 1 5;
然而,对每一个钩子长为0的元素,我们都可以删除它,这样会得到不同的young tableau,
易知这些young tableau不会重复,由于一个序列插入只会得到一个=一种young tableau
那么再对这些young tableau删除所得序列不会重复,这样不重复性得到证明;
不遗漏性:
我们来看一下钩子长为0的元素,一定存在一个钩子长为0的元素,它是被最后一个插入的元素挤上来的(可能就是它本身);
它是如何被挤上来的?
首先直接挤它的元素一定比它小;如上图,插入5将直接挤6;
第二,若它不是从右往左第一个比它小的元素(如,第二个,第三个),那么用待删除元素替换它将违背young tableau性质,这与在插入过程中
一直是young tableau矛盾;这样我们一直进行将得到最后插入的元素;
枚举删除每个钩子长为0的元素,我们将不会遗漏;
很明显,现在已经可以用动规了;在动规之前,我还给你一个性质来打消你开一个二维数组来保存输入的各个元素的想法;
性质:该题的答案与元素本身无关而仅与young tableau的形状有关;
记得我定义删除操作后给出的第一条性质吗?
你可以轻易地发现和证明删除后的young Tableau形状为直接删除该元素的形状;
利用它,你完全可以抛开所有元素而仅仅关心young Tableau形状;例:
3 | |
2 | 5 |
1 | 4 |
x | |
x | x |
x | x |
x | |
x | |
x | x |
x | x |
x | x |
事实上,我们考虑一下具有该形状的young tableau的个数:
考虑young tableau中最大的元素,它只能放在钩子长为0的位置,而剩下的位置可由剩下的元素随意摆放而不破坏youngtableau的性质
例:
x | |
x | x |
x | x |
5 | |
x | x |
x | x |
x | |
x | 5 |
x | x |
这与我给出的原题答案具有相同的递推式;
那么,他们两个数量相等;
而具有该形状的young tableau的个数可以在黑书young tableau那一节找到公式——钩子公式(其实我不会证);
这样,我们可以用极小的空间O(1),极短的代码,用极短的时间解决该问题;
这是不是比搜索好一点?