T1【GDKOI2007】大航海
有n个黑点,m个白点,有一些连接黑点和白点的边,现在从任意一个点出发,沿着边走,要求不能经过重复的点,且不能经过编号小于等于已走过的点,求经过的点的最大权值和。
一个朴素的dp,设fi,j,0/1f_{i,j,0/1}fi,j,0/1表示黑点走到i,白点走到j,现在在i或j的最大价值。转移显然。
但是这样时间空间都无法承受,但我们发现fi,j,0f_{i,j,0}fi,j,0由fk,j,1(k<i)f_{k,j,1}(k<i)fk,j,1(k<i)转移。这一部分只需要在枚举到j的时候记录最大值即可。
fi,j,1f_{i,j,1}fi,j,1由fi,k,0(k<j)f_{i,k,0}(k<j)fi,k,0(k<j)转移,这一部分与i有关,那么枚举j的过程其实也就会枚举到k,拿个变量记录最大值即可。
这时你发现f没用了。
比赛刚开始并没有想到,后来再列了一下式子才观察到。以后有dp的题还是要列一下转移式。
T2 【GDKOI2007】纳克萨玛斯
给n个人,每个人擅长一些技能,而且每个人属于0或1,现在要求把这些人分成若干个组,使得每个组都有一个人负责一个位置,且每个人只能负责一个位置,问最多能组成多少个组?还要保证被选中的人中0的数量与1的数量之差,不超过D。
刚开始是想网络流,之后就想到了二分,但是我在建图的时候特别傻,想要直接建mid∗summid*summid∗sum个点,这很脑残,其实只要建m个点每个点流向汇点mid的流量。但是不知道D的限制怎么搞。其实只要建一个两个点,一个连0点,一个连1点,容量设为(mid∗sum+d)/2(mid*sum+d)/2(mid∗sum+d)/2,这样就保证了不会超过d。二分即可通过。
T3 【GDKOI2007】轰炸
给数轴上的n个点的坐标和防御值,现在有m个炸弹,给出炸的范围以及炸弹的破坏值,没有被破坏的点如果在范围内且防御值小于破坏值的会被炸掉,求每个炸弹能炸的点的数量。
因为每个点只会被炸一次,所以可以用线段树维护区间最小值,每一次暴力往下删点,如果区间最小值大于破坏值,则不往下递归,删完点后更新最小值。时间复杂度为O(nlogn)O(nlog_n)O(nlogn)。
T4【NOI2017模拟7.1】景中人
给定平面上的n个点,要求用最少的矩形覆盖这n个点,要求矩形面积不超过s,且有一边在x轴上。
先对点离散化和排序,设fi,jf_{i,j}fi,j表示覆盖编号为i到j的点需要的矩形数量。如果可以直接用一个矩形覆盖则赋值为1,否则先用一个矩形覆盖,然后矩形上方的点用一个dp,来计算。设gkg_{k}gk表示i~k中在矩形上的点以被其他点覆盖用的最小矩形数。转移为gk=ming[t−1]+ft,k(yt>Y)g_{k} = min{g[t - 1]+f_{t,k}}(y_t > Y)gk=ming[t−1]+ft,k(yt>Y),Y为矩形的高度。最后转移一下即可。
2256

被折叠的 条评论
为什么被折叠?



