人人网上一道题目解答

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值