今天学习了三种解决区间覆盖问题的 方法,也学到了一种新算法,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就是最小边数
以上三种算法复杂度越来越高,代码也越来越长,越来越难写,推荐掌握第一种,但是不能只会效率最高的而忘记了其他的思路和算法的本质,所以三种都要有掌握