现在的位置: 首页 > 综合 > 正文

人人网上一道题目解答

2013年08月02日 ⁄ 综合 ⁄ 共 689字 ⁄ 字号 评论关闭

链接: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);望各路大神指教~

抱歉!评论已关闭.