SRM489 Div1 1000pts:AppleTree

挺优秀的一道题,想出做法时感觉很惊艳。

题意:

数轴上有\(D\)个连续整数刻度,有\(N\)棵树要种在这些刻度上,其中第\(i\)棵与两旁(如果有的话)相邻的树至少要相距\(R_i\),问方法数。

\(1 \leq N , R_i \leq 40\)

思路:

首先,如果确定了种树的顺序,就确定了相邻树的最小间距。把\(D\)减掉最小间距之和,所得的就是“冗余刻度”的数量。

把这个数量分配给\(N+1\)段间隙,用插板法可以求出方法数。

所以问题在于,对于每一个\(L\),求出1到\(N\)的排列\(P\)的数量,满足:

\[\sum_{i=1}^{N-1} \mathrm{max}(R_i, R_{i+1})=L\]

注意到,对于使\(R_i\)最大的\(i\),它的两侧种的是什么树,不影响这两段间隙的最小长度。

根据套路,这个时候我们应该在\(i\)的位置把排列割开并分别处理。

对于一个1到\(N\)的子集的长度为\(l\)的排列\(P\),定义其代价为:\(\sum_{i=1}^{l-1} \mathrm{max}(R_i, R_{i+1})\)。

于是想到DP状态:\(dp[i][j][k]\)表示,1到\(i\)这\(i\)个数,组成了\(j\)个不相交排列,排列的代价总和为\(k\)的方法数。

转移时考虑第\(i\)个数在一个排列的两端还是中间,删除之并转移即可。

注意到\(i,j \leq 40\),\(k \leq 1600\),故复杂度没有问题。

原文地址:https://www.cnblogs.com/turboboost/p/AppleTree.html

时间: 2024-08-04 02:50:54

SRM489 Div1 1000pts:AppleTree的相关文章

CF#462 div1 D:A Creative Cutout

CF#462 div1 D:A Creative Cutout 题目大意: 原网址戳我! 题目大意: 在网格上任选一个点作为圆中心,然后以其为圆心画\(m\)个圆. 其中第\(k\)个圆的半径为\(\sqrt{k}\),\(m\)个圆的编号依次为\(1\)~\(m\). 定义一个格点的美妙值\(g(x,y)\)为包含了它的所有圆的编号之和. 定义\(f(n)\)为:当画了\(n\)个圆时,\(f(n) = \sum_{i,j\in R} g(i,j)\). 现在非常变态的问你一个非常无聊的恶心问

codeforces284 div1 B:概率dp

蛋疼的期末..好久没有A题了,,惭愧啊 昨晚打起精神准备做cf 结果竟然忘记注册了..拿学长号看了看题,今早起来补了一道dp 题目大意: 有n首歌,你需要边听边猜 对于第 i 首歌 每听一分钟你猜出它的概率为p[i],同时在听这个歌t[i] 分钟时,你一定能猜出来 猜完当前歌曲 下一分钟开始听下一首歌 给定总时间 T 求猜出歌曲的期望.. 题解:这个题的算法我想的还是很快的 开两个数组 dp[i][j]表示第 i 分钟还在听第 j 首歌的概率,这样如果没有 t[i]的限制就可以很容易的写出dp方

SRM 631 DIV1

SRM 631 DIV1 A:最多肯定只需要两步,中间的两行,一行黑,一行白就可以了,这样的话,只需要考虑一开始就满足,和枚举一行去染色满足的情况就可以了,暴力即可 B:贪心,一个记录当前有猫的位置和当前超过一只猫的位置,然后位置排序从左往右找,如果当前能移动到之前超过两只的位置,就全部移动过去,不增加,如果不行,那么考虑当前这个能不能铺成一条,如果可以,相应更新位置,如果不行,就让猫全部堆到右边右边去,然后堆数多1 代码: A: #include <iostream> #include &l

topcoder 673

DiV1 300:给一组士兵再给一组战马都有权值. 安排战马的顺序的方案数,是第一个士兵和其战马的权值乘积最大. 做法:随便暴力就好. 枚举战马和第一个士兵匹配.其他士兵按权值从大到小排序,战马权值按从小到大排序.1. 举个例子:士兵,A,B,C,D,E 战马,a,b,c,d,e 第一个士兵和其战马的乘积是:tmp A 可以A*c<tmp; B 可以 B*d<tmp; B 与战马的乘积小于tmp,其战马的权值一定大于等于c,因为 1. 所以答案就是ans = (c-第几个士兵+1)*(d-第几

(二)this、call和apply

在javascript中,this关键字总让一些初学者迷惑,Function.prototype.call, Function.prototype.apply这两个方法广泛的运用.我们有必要理解这几个概念. 一:this 跟别的语言大相径庭的是,javascript的this总是指向一个对象,而具体指向那个对象在运行时基于函数的执行环境动态绑定的,非函数被声明时的环境. (1).this的指向 除去不常用的with和eval情况,具体到实际的应用中,this的指向大致分为下面4种. 作为对象的方

css 重新学习系列(3)

摘自:http://www.cnblogs.com/websugar/articles/2406416.html 十步图解CSS的Position CSS的position,我想做为一个Web制作者来说都有碰到过,但至于对其是否真正的了解呢?那我就不也说了,至少我自己并不非常的了解其内核的运行.今天分十步介绍CSS的“position”中的“static.relative.absolute.float”使用,觉得蛮有意思的.整理了一下贴上来与大家一起分享.希望大家能喜欢. 在图解这十个过程之前,

十步图解CSS的position

CSS的positon,我想做为一个Web制作者来说都有碰到过,但至于对其是否真正的了解呢?那我就不也说了,至少我自己并不非常的了解其内核的运行.今天在Learn CSS Positioning in Ten Steps一文中分十步介绍了CSS的"position"中的"static.relative.absolute.float"使用,觉得蛮有意思的.整理了一下贴上来与大家一起分享.希望大家能喜欢. 在图解这十个过程之前,我将实例的代码放上来,好让大家一个实体参考

div嵌套引起的margin-top不起作用

通常大家在制作网页的过程中会遇到很多棘手的问题,比如我在写一个页面的时候,遇到了div嵌套引起的margin-top不起作用,对内部的div设置margin-top时,内部对于外部的div并没有产生一个margin值,而是外部的div相对于上面的div产生了一个margin值,为什么会出现这种情况??? 这是因为嵌套div中margin-top出现转移,在部分浏览器中,两个嵌套的div,如果外层父元素div的padding值为0,那么内层div的margin-top,margin-bottom值

w3school学习 - javascript入门

在浏览一下客户端代码时,经常会遇到javascript脚本,系统的学习一下对以后更深入了解客户端很有好处. 1. 应用场景 改进设计 验证表单 检测浏览器 创建cookies等 2. 入门实例 这里的document是 js中的 的html DOM对象 http://www.w3school.com.cn/jsref/dom_obj_document.asp 1. 改变html内容 document.write("<h1>This is a heading</h1>&qu