排座位&&Little Elephant And Permutation——排列dp的处理

排列的问题,就是要把序列排个序,使之达到某种最优值或者统计方案数

dp可以解决部分排列问题。

通常的解决方案是,按照编号(优先级)排序决策,从左到右决策两种。

这里主要是第一个。

 

排座位
• 有 ? 个人坐成一排
• 对于相邻两个人 ?, ?
• 如果 ? < ?,则会产生 ?? + ?? 的愉悦度
• 否则会产生 ?? + ?? 的愉悦度
• 求一个排列让最大化愉悦度
• ? ≤ 3000

从左到右决策,肯定就要状压了。

但是可以发现,我们并不关心一个i左右是谁,只关心编号和i的相对大小。

而且,这个贡献ai,bj,ci,dj是可以独立的。

思路就比较自然了。

我们按照编号从小到大决策。

每个点i的放置有几种:

1.左右都比i小。

2/3.左/右比i大。

4.左右都比i大。

 

但是麻烦的是,如果直接dp可能最后形成不了一个序列。

不是一个整段。

所以,还要引入段的概念。

 

i的决策是:

1.左右都比i小,即连接之前的两个段。

2/3.左/右比i大,另一个比i小,即连接一个段。

4.左右都比i大,即i自成一段。

每种中,i对答案的贡献可以现场统计。

因为,我们的编号是从小到大处理的,

如果我们能够正确连接的话,这个贡献一定是可以算上的。

 

f[i][j]表示,处理完前编号i个,形成了j段的方案数。

 

还有一个问题是,边界情况,没有左/右,没有这个贡献。

那么可以f[i][j][0/1][0/1]表示是否放了最左边最右边的。

答案:f[n][1][1][1]

 

 

Solution :

假定ai是一个1~n的数列。

对于合法的bi数列,乘上n!就是所有的ai和bi的情况了。

 

这样,贡献就比较好统计了。

dp[i][j][k]表示,处理bi中前i个位置,有j个是空的,贡献是k的方案数。

看这篇题解:

【做题】TCSRM592 Div1 500 LittleElephantAndPermutationDiv1——计数&dp

 

其实还有一个题:(虽然不是dp)

有趣的家庭菜园

转载于:https://www.cnblogs.com/Miracevin/p/9748363.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值