日常学习——区间覆盖

今天学习了三种解决区间覆盖问题的 方法,也学到了一种新算法,floodfill,用dfs+记忆化搜索实现

这里就先不说了,主要想说的是区间覆盖

先说大概的问题,就是用最少的线段覆盖最多的区间

首先第一种:贪心

先对左端点进行排序,然后选择第一条,在第一条的右端点向左枚举每个线段的左端点,也就是在左端点小于当前右端点的所有线段,然后选取右端点最大的一个,更新右端点,算法的复杂度只有O(N),实现也比较简单

第二种:动态规划

(这个是我自己理解的,个人也不大确定)

设dp[i][j]为第i条线段,当前右端点为j所选取的最小线段

则dp[i][j]=min(dp[i-1][j],dp[i-1][j-x[i]]+1)其中x[i]为长度,具体的实现还要一定的步骤,比如初始化和处理边界

第三种:spfa

对于每条边正向建图,每条边的权值为1,然后从终点开始反向建图,添加长度为单位长度,权值为0的反向线段,为了往回走,然后从起点走一个spfa,求出来的distant就是最小边数


以上三种算法复杂度越来越高,代码也越来越长,越来越难写,推荐掌握第一种,但是不能只会效率最高的而忘记了其他的思路和算法的本质,所以三种都要有掌握

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值