poj 3171 dp+线段树(最小代价覆盖全部区间)

该博客介绍了如何解决POJ 3171问题,即在考虑区间权值的情况下,找到覆盖特定区间[m, e]的最小代价组合。通过动态规划策略,将所有区间的代价初始化为无穷大,然后对给定的n个区间按左边界排序。在遍历过程中,更新每个区间的最小代价,并利用线段树实现快速查询和更新区间最小值。最终找到区间[E, E]的最小值作为覆盖[m, e]的总代价,如果等于无穷大则表示无法完全覆盖。" 136551144,13449940,遗传算法优化BP神经网络在时间序列预测中的应用,"['遗传算法', '神经网络', '回归', '人工智能', '数据挖掘']
摘要由CSDN通过智能技术生成

题意:给定一个需要覆盖的区间[m,e],给出n个区间[ai,bi],每个区间有一个权值wi。求能够把[m,e]覆盖所选取的区间的最小代价之和。

思路:如果没有权值,那么贪心可以解决这个问题,见poj2376。但是此处带权,那么贪心不成立,需要考虑用动态规划。先将所有区间的代价设置为无限大,然后将给的n区间按左优先排序,然后进行一趟遍历:第i个区间为[a,b],先查询[a-1,b-1]区间的最小值min,然后更新[a,b]的最小值为Ci+min(表示从m到b都覆盖到了的最小代价)。最后找到[E,E]区间的最小值就是要覆盖[M,E]区间的最小代价了,若等于无限大值则说明中间有段区间无法覆盖。其中涉及查询区间最小值的操作,所以考虑用线段树来求。

采用线段树的时候还是记得设置一个临时变量,在查询的时候再向下带。不要每次都更新到叶子。其中num是区间内真正的最小值,而flag则是没有往下带的最小值。

线段树的num域充当了动态规划的dp数组。相当于dp的思想+线段树的实现。

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <queue>
using namespace std;
#define INF 0x3ffffffffffffff
#define clr(s,t) memset(s,t,sizeof(s))
#define N 10005
#define M 86405
struct node{
    int a,b,w;
    bool operator<(const node &y)const{
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值