2022.1.20

T1【GDKOI2007】大航海

有n个黑点,m个白点,有一些连接黑点和白点的边,现在从任意一个点出发,沿着边走,要求不能经过重复的点,且不能经过编号小于等于已走过的点,求经过的点的最大权值和。

一个朴素的dp,设 f i , j , 0 / 1 f_{i,j,0/1} fi,j,0/1表示黑点走到i,白点走到j,现在在i或j的最大价值。转移显然。

但是这样时间空间都无法承受,但我们发现 f i , j , 0 f_{i,j,0} fi,j,0 f k , j , 1 ( k < i ) f_{k,j,1}(k<i) fk,j,1(k<i)转移。这一部分只需要在枚举到j的时候记录最大值即可。

f i , j , 1 f_{i,j,1} fi,j,1 f i , 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。

刚开始是想网络流,之后就想到了二分,但是我在建图的时候特别傻,想要直接建 m i d ∗ s u m mid*sum midsum个点,这很脑残,其实只要建m个点每个点流向汇点mid的流量。但是不知道D的限制怎么搞。其实只要建一个两个点,一个连0点,一个连1点,容量设为 ( m i d ∗ s u m + d ) / 2 (mid*sum+d)/2 (midsum+d)/2,这样就保证了不会超过d。二分即可通过。

T3 【GDKOI2007】轰炸

给数轴上的n个点的坐标和防御值,现在有m个炸弹,给出炸的范围以及炸弹的破坏值,没有被破坏的点如果在范围内且防御值小于破坏值的会被炸掉,求每个炸弹能炸的点的数量。

因为每个点只会被炸一次,所以可以用线段树维护区间最小值,每一次暴力往下删点,如果区间最小值大于破坏值,则不往下递归,删完点后更新最小值。时间复杂度为 O ( n l o g n ) O(nlog_n) O(nlogn)

T4【NOI2017模拟7.1】景中人

给定平面上的n个点,要求用最少的矩形覆盖这n个点,要求矩形面积不超过s,且有一边在x轴上。

先对点离散化和排序,设 f i , j f_{i,j} fi,j表示覆盖编号为i到j的点需要的矩形数量。如果可以直接用一个矩形覆盖则赋值为1,否则先用一个矩形覆盖,然后矩形上方的点用一个dp,来计算。设 g k g_{k} gk表示i~k中在矩形上的点以被其他点覆盖用的最小矩形数。转移为 g k = m i n g [ t − 1 ] + f t , k ( y t > Y ) g_{k} = min{g[t - 1]+f_{t,k}}(y_t > Y) gk=ming[t1]+ft,k(yt>Y),Y为矩形的高度。最后转移一下即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值