码迷,mamicode.com
首页 > 其他好文 > 详细

[Sdoi2010]地精部落

时间:2018-07-28 20:28:51      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:而且   定义   bsp   情况   思考   根据   关心   规律   思想   

题意:

给定一个n,询问有多少种1~n的排列,使得对于任意的一个位置上的数i,相邻位置上的数都比它大,或者都比它小。(两边位置只有一个相邻的位置)

 

题解:

这个题目实际上是POJ1037 的简单版。lyd书上有,还看过,做过,但是就tmd忘了(或者根本没有理解)

(看到的第一反应就是这个题目,但是立刻否决了。因为题目也记不清了。而且就算想下去估计也想不起来)

 

DP无疑。

先想到:f[i][j]表示,前i个数,最后一个数是j的方案数。但是,第i+1个数也可以放在前i个位置。

这就考虑不到了。

于是开始打表,推规律,无果。

于是根据表开始DP,理性分析:设f[i]表示,i个排列的合法解。

推1.5h,发现和i-1非法解有关,而i-1的非法解中的转移还不一样。还得往后推。。。。。

感叹了一句:“子子孙孙无穷匮也~~~”

然后看题解。找了找lyd的书。。。

 

正解:

定义:一个数比相邻的数都大,叫高位。反之叫低位。

设f[i][j][0/1]表示,用i个大小不同的数,填前i个位置,最后一个数,从小到大排在第j位,并且处于(0低位)(1高位)的方案数。

然后转移:

f[i][j][0]=f[i-1][p][1] (j<=p<=i-1)

f[i][j][1]=f[i-1][p][0] (1<=p<=j-1)

如果在i中排在第j位,一定比i-1中排在第j位的数小。(反证一下)

反之,i中j位数,一定比i-1中j-1位数大。

为什么转移是对的???

注意,i表示i个大小不同的数,j是相对的第j位,并不是绝对的。

这样设状态是因为,i个大小不同的数,无论是什么数,对于最后一位是j名,处于0/1位的情况,方案数都是一定的。(类似离散化思想。1,2,3,4 和100,200,300,400方案一样)

我们在第i位枚举的j,其实就是相当于枚举1~i中的j。

相当于,然后把其他的数都扔到前面i位去,它们随便排列(反正方案数和大小无关)只要最后一个名次,位置都对,就可以转移!!!

所以转移就是对的。

 

代码就不写了。没有难度了。

 

总结:

漂亮的思维题。

主要是在设置状态的时候,用离散化的思想,抓住了i个数排列的方式都是一样的。

就是说,是几不是几,题目无所谓,我们也不关心。我们需要的时候,相当于让它是几就是几。

这种“相对”设法,还要多思考,多总结。

[Sdoi2010]地精部落

标签:而且   定义   bsp   情况   思考   根据   关心   规律   思想   

原文地址:https://www.cnblogs.com/Miracevin/p/9383151.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!