HDU 6249
来源:互联网 发布:浮雕制作软件 编辑:程序博客网 时间:2024/06/14 01:04
HDU 6249题意
题目描述的是有m个区间,然后选择出k个区间,让所染色的区间长度最长。
分析
首先可以先去掉那种包含类型的区间
如图中的蓝色区间是可以去掉的
接下来对于情况1的区间
如果选了红色的获得的贡献就是直接加上红色区间的长度,情况1要找在红色区间前的最大的来继承
如果选了红色的获得的贡献只有红区间的右端点减去蓝区间的右端点
/*************************************************************************> 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;}
阅读全文
0 0
- HDU 6249
- hdu
- hdu
- HDU
- hdu ()
- hdu
- hdu
- HDU
- HDU
- hdu
- hdu
- HDU
- Hdu
- hdu
- hdu-
- hdu
- hdu
- hdu
- javascript中基础但是很容易忽略的点
- 单例设计模式
- markdown转换word,pandoc
- Win7下Laravel简单安装
- 在当前Activity中finish掉其它Activity的方法
- HDU 6249
- 第14周项目1(8)- 验证算法 基数排序
- [转]MFC运行机制(自认为介绍比较清晰的)
- 开源时序数据库influxDB解决方案
- springcloud实战之1 技术选型:dubbo还是springcloud
- 第十一周项目三 图遍历算法的实现(1)深度优先遍历
- 秒拍的高性能视频播放调度系统
- 第五周 【项目3
- 没有文件扩展“.vbs”的脚本引擎的解决方案