波浪

波浪
【问题描述】
阿米巴和小强是好朋友。
阿米巴和小强在大海旁边看海水的波涛。小强第一次面对如此汹涌的海潮,
他兴奋地叫个不停。而阿米巴则很淡定,他回想起曾经的那些日子,事业的起伏,
情感的挫折……总之今天的风浪和曾经经历的那些风雨比起来,简直什么都不
算。
于是,这对好朋友不可避免地产生了分歧。为了论证自己的观点,小强建立
了一个模型。他海面抽象成一个1 到N的排列P[1… N ] 。定义波动强度等于相邻
两项的差的绝对值的和,即:
L  = | P2 –  P1| + |  P3– P2| + … + | PN– PN -1|
给你一个N和M ,问:随机一个 1…N的排列,它的波动强度不小于M 的概率
有多大?
答案请保留小数点后K位输出,四舍五入。
【输入格式】
输入文件wavel.in的第一行包含三个整数 N, M 和K,分别表示排列的长度,
波动强度,输出位数。
【输出格式】
输出文件wavel.out 包含一个小数点后 K 位的实数。
【样例输入】
3 3 3
【样例输出】
0.667

 

 

 

来自FHQ的题解:

一个典型的dp题。
我们把1~N依次插入到序列里。
每插入一个数,我们就要决定他左右两边的数是比他大还是比他小还是没有。
之后,计算好当前的所有数对绝对值和的贡献。
状态是:已经插入了i个数,留了j个位置可以供插空,两端的情况是k,当前的和是s的情况下,有多少种方法。
复杂度很高,但是是多项式的。
 
/---------------------------------------------/
 
本题解是结合了范神的“蟒蛇”标程及其意识流题解才知道的:
定义dp状态f[i][j][k][l]表示现在从小到大插入到了第i个数,插入的数字给答案的贡献累加是j,并且加入的数字已经形成了k段数的方案数(写高精度),l表示现在插入的数字中有多少个已经在边界上了(边界上数字的贡献于其他不同,所以要多一维状态)
转移方程考虑插入第i个数的位置极其贡献:
1:若数字i加入时新加入一个段,那数字i的贡献是-2*i,因为如果新开了一段,这个数字两边的数肯定要比这个数字大,而若a<b,a<c,排列成bac时它的波动程度=b-a+c-a!新开一个段的位置有(现有段数+1)种!
2:若数字i加入时段数没有改变,则i对波动程度没有影响,因为一边数字已加,另一边数字没有加,i的贡献=-i+i,方案数位(现有段数×2)种。
3.若数字i加入时将两段数合并,那数字i个贡献数2*i,因为i两边的数已加,且比i小。
而加到边界上的情况只有1,2两种,3无法在边界上成立,于是有了5+5+3种转移方程...
posted @ 2013-06-06 19:38  xsc906476903  阅读(144)  评论(0编辑  收藏  举报