链接:http://zhan.renren.com/mathbeauty?gid=3602888498028110403&checked=true
有N块木板,高度从1递增至N。要求对这些木板进行排列,使之从左边看能看到L块,从右边看能看到R块。也就是说高的木板会把低的木板遮住。问总共有多少种排列方法。
这个题目经过网上查询有两种方法,非自己所想:
方法1:
首先是求出a[i][j],a[i][j]表示高度各不相同的i块木板从某一侧只能看到j块。
a[i][j] = ∑(a[k][j-1] * C[i][k] ) k∈(j-1, i);
a[i][0] = (i-1)!;
具体的过程是枚举最高处的位置。
然后通过再次枚举最高点的位置,将问题转化为从左边看有a[k][l],从右边看有a[i - k - 1][r]的两种互不影响的排列。
ans[i][l][r] = ∑( a[k][l] * a[i - k - 1][r] * C(i, k) ) k∈(l - 1, i - r - 1);
复杂度:求得C函数的复杂度是O(n^2),求得a[i][j]的复杂度是O(n^2),最后结果的复杂度也是O(n^2);
方法2:
直接求 ans[i][l][r]:这一次用构造的方法,逐步构造出解,对于ans[i][l][r]来说,构造每一次插入最小值,应该分三种情况:
从左端插入:ans[i-1][l-1][r];
从右端插入:ans[i-1][l][r-1];
从中间插入:ans[i-1][l][r];
特别地:ans[i][l][0] =0,ans[i][0][r] = 0;
感觉可以用记忆化搜索的方法,求得结果。
复杂度:这个不会求,个人感觉是O(n^3);望各路大神指教~