HDU 6249

HDU 6249题意

题目描述的是有m个区间,然后选择出k个区间,让所染色的区间长度最长。

分析

首先可以先去掉那种包含类型的区间
avatar
如图中的蓝色区间是可以去掉的

接下来对于情况1的区间
avatar
如果选了红色的获得的贡献就是直接加上红色区间的长度,情况1要找在红色区间前的最大的来继承
avatar
如果选了红色的获得的贡献只有红区间的右端点减去蓝区间的右端点

/*************************************************************************
> Author: MentalOmega
> Mail: 965194745@qq.com
> Created Time: 2017年12月13日
> function:
> ************************************************************************/
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 2222;
struct Range
{
int l,r;
bool operator < (Range &o)
{
    return l<o.l||(l==o.l&&r>o.r);
}
bool operator == (Range &o)//unique函数用
{
    return l<=o.l&&r>=o.r;
}
}range[MAXN];
int dp[MAXN][MAXN]={0};
int main()
{
if (fopen("in.txt", "r") != NULL)
{
    freopen("in.txt", "r", stdin);
    // freopen("out.txt", "w", stdout);
}
int t;
cin>>t;
int icase=0;
while(t--)
{
    printf("Case #%d: ",++icase);
    int n,m,_k;
    scanf("%d%d%d",&n,&m,&_k);
    for(int i=0;i<m;i++)
    {
        int l,r;
        scanf("%d%d",&l,&r);
        r++;
        range[i]={l,r};
    }
    sort(range,range+m);
    m=unique(range,range+m)-range;
    memset(dp,0,sizeof dp);
    int ans=0;
    for(int k=0;k<_k;k++)
    {
        int pos=0;
        int maxlen=0;
        for(int i=0;i<m;i++)
        {
            while(pos<i&&range[pos].r<range[i].l)//这里寻找第二种方式的最大值来继承
            {
                maxlen=max(maxlen,dp[pos][k]);
                pos++;
            }
            if(pos!=i)
                dp[i][k+1]=max(dp[i][k+1],dp[pos][k]+range[i].r-range[pos].r);//第一种情况的继承方式
            dp[i][k+1]=max(dp[i][k+1],maxlen+range[i].r-range[i].l);//第二种区间的继承方式
            ans=max(ans,dp[i][k+1]);
        }
    }
    printf("%d\n",ans);
}
return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值