pku 1037 A decorative fence(DP,划分)

38 篇文章 0 订阅
33 篇文章 0 订阅

 

题目大意:题目讲得很复杂,其实数学模型很简单。就是 1~nn 个数,若给出一个排列 a1,a2,a3…an ,对所有 i 满足 (ai-a(i+1))(ai-a(i-1))>0 (其实也就是数按大小的波浪形排列),则该排列符合要求。各个排列之间按字典序排序。(当 n=3 时,满足条件的序列依次为( 132 ),( 213 ),( 231 ),( 312 ))

输入 N,C, 要求输出 n=N 时的第 C 个符合要求的序列。

分析:有 100 个测试数据,直接搜索不行。我们通过计算区间,从前往后依次确定各个位置的数字。

先做预处理, T[i][j]表示n=ia1=j1<=j<=n )时,存在的符合前面要求的序列的个数 。这样就可以根据数组 T[N][]C 的值,得到 a1 的值。当a1的值确定了, C-=T[n][j](1<=j<=a1-1),n=N-1 , 问题的规模变为了 N-1 , 得到了一个子问题。可是,当 a1!=1&&a1!=n, 后面的数就不连续了,这时候还能把它当成子问题来处理吗?答案是肯定的,我们只要在心里想,把后面 N-1 个数中,所有大于 a1 的数都减 1 。这样,数又会连续了。我们就可以继续根据 T [N-1][]来确定 n=N-1 时的第一个数 的值,也即a2,以此类推,直到确定所有数。需要注意的是,因为数必须成波浪形,在实际的代码中,我们用 M,W 两个数组来取代 TM[n][k] 表示 a1=k,a2>a1 时的情况, W[n][k] 表示 a1=k,a2<a1 时的情况。因为是按字典序排列,对相同的 k ,我们总是优先考虑 W

 

WM 的计算可以采用如下递推方法:

M[n] [x] = W[n-1] [i]      (1<=i<=x-1)

W[n] [x] = M[n-1] [i]     (x<=i<=n-1)( 我们只要在心里想 , 把后面 N-1 个数中 , 所有大于等于 x 的数都加 1)

M[n] [x] = W[n] [n-x+1]  ( 长度从小到大排列的木条 , 第 x 根与第 n-x+1 根是对应的 )

 

需要指出的是,在放第一个数的时候, WM 方式都要考虑,而后面的数,则根据前面的情况选择是 W 还是 M 。还有,在最后输出的时候,也会稍微有点纠结。

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值