Topcoder SRM666 DIV1第二题,递归+DP

题意:

给一个n,表示有n个球和n种颜色,现在让你给这些球涂色,涂色的方法这样:假设这里有三个球,第一个和第三个已经涂了,这时在涂第二个的时候,可选颜色数量为(n-2),这里不管左右两个球涂的颜色是否相同,它们只要涂色了,中间这个球可选颜色种类就是n-2。这就是题目中规定的涂色的规则。现在问你,当涂色顺序分别按照permutation(n)的时候,所有涂色种类之和是多少,结果对(10^9+7)取模。

分析:

当计算n个球的时候,可以考虑把第n个球放到前面n-1个球中去,然后去考虑,怎样由前面以求的状态转移到现在的状态。当这个球放到n-1个球的头部或尾部,这两种情况的涂色种类都是(n-1)*f(n-1);当第n个球放到n-1个球之间呢,好像就比较难考虑了。我最开始的分析是这样的:第n个球放进去的时候,两边肯定已经涂色了,所以种类应该乘以(n-2),但是它会影响到左右两个球中的后涂色的一个球,假设右边那个球后涂色,那么它的涂色种类可以(加1),但是右边这个后涂色的球它初始的涂色种类是多少呢,又得分情况去考虑,感觉越分类越乱,始终没法转化成一个简单统一的问题去解决,最终只好放弃这种思路。我看了Topcoder上其他人的代码(阿根廷黄名哥:diego_v1),瞬间明白了,如何通过以求的状态来转移到现有状态,思路是这样:枚举插入第n个球的位置,然后原有序列被分为了两段:左段L,右段R;具体分法为排列组合数C[n-1][L],我们不用管两边都具体分得到了什么数,只用知道它们是有相对顺序的,这样根据相对顺序的涂色就可以使很多涂色排列等效:如左边分得1 2 3 和分得1 3 5涂色的种类数是一样的,通过这个发现,就可以使问题大大简化,然后右侧也是如此,通过递归的方法去求L段和R段,这个问题就解决了。

关键点:排列的相对大小顺序可以使得很多涂色排列等效枚举分段位置,递归的思想

具体代码:

参考Argentina的黄名哥:diego_v1代码
有时间再写


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值