巧妙计数dp-Permutation Counting

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6880

题目大意:

对于任何一个排列,可以生成b数组来表示序列的变化情况。    

                                                 

现在给你一个b序列。问你有多少种排列符合上述b数组的限制。 (n <= 5000)

思路:

考虑dp.现在最大的问题是无法解决排列的后效性。

当我们从dp(i - 1 , ?) => dp(i , j) 的过程中。实质上可以看作要:

将 1 ~ i - 1 中的 j 置换出来到最后一个位置,且将 1 ~ i - 1 个位置中 插入一个数 i . 且依然符合b数组对排列的限制.

解决方法:将前 1 ~ i - 1 个数中的 >= j 的数统统 + 1 . 这样使得 i - 1 => i . 空出来一个j.且限制不变.

转移就很显然了. 注意dp含义以及前缀和优化,

全部评论

相关推荐

10-31 13:04
南华大学 Java
嵌入式的小白:很多面试,面试前不会去打扰cto的,但一般cto不会在这些小事上刷人,只能说这个cto比较操心,啥重要不重要,紧急不紧急的,估计都会过问,平淡看待吧
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务