线段覆盖2 CODEVS
来源:互联网 发布:美白牙齿知乎 编辑:程序博客网 时间:2024/05/29 07:00
点击打开链接
正解应该是序列DP 感觉我这个法子又像DP又像贪心 有点乱搞..
先按左顶点小的在前 相等则右顶点小的在前来给线段排序
从前往后遍历 看当前线段的左顶点之前那些不交线段中(即右顶点小于等于当前线段的左顶点) 已求得的最大值是多少 在最大值的基础上加上当前线段的值 记为当前线段的右顶点之前那些不交线段中的 已经求得的值(未必最大)
点的取值范围是[0,1000000] 最多1000条线段
首先想到离散化 但这里不用考虑重点 直接用一个num[1000000]记录那些是线段顶点的坐标 last[1000000]记录是线段顶点的坐标的前一个是线段顶点的坐标
按上述从前往后遍历一遍即可
#include <stdio.h>#include <cstring>#include <algorithm>using namespace std;struct node{ int l; int r; int val;};struct node line[1001];int num[1000001],book[1000001],last[1000001];int n;int cmp(node n1,node n2){ if(n1.l==n2.l) { return n1.r<n2.r; } else { return n1.l<n2.l; }}int main(){ int i,j,p,maxx,ans; while(scanf("%d",&n)!=EOF) { memset(num,0,sizeof(num)); memset(book,0,sizeof(book)); memset(last,0,sizeof(last)); for(i=1;i<=n;i++) { scanf("%d%d%d",&line[i].l,&line[i].r,&line[i].val); book[line[i].l]=1; book[line[i].r]=1; } sort(line+1,line+n+1,cmp); p=-1; for(i=1000000;i>=0;i--) { if(book[i]==1) { if(p==-1) { p=i; } else { last[p]=i; p=i; } } } last[p]=-1; ans=0; for(i=1;i<=n;i++) { p=line[i].l,maxx=0; while(p!=-1) { if(num[p]>maxx) { maxx=num[p]; } p=last[p]; } num[line[i].r]=max(num[line[i].r],maxx+line[i].val); if(num[line[i].r]>ans) ans=num[line[i].r]; } printf("%d\n",ans); } return 0;}
阅读全文
0 0
- 线段覆盖2 CODEVS
- Codevs 3027 线段覆盖2
- CodeVS 3027 线段覆盖2
- 【Codevs 3027】线段覆盖2
- CODEVS 3027 线段覆盖 2
- Codevs 3027 线段覆盖 2
- codevs 3037 线段覆盖 5,codevs 3012 线段覆盖 4,codevs 3027 线段覆盖 2
- Codevs 3027 线段覆盖 2 序列dp
- codevs 3027_线段覆盖 2_dp
- codevs 1214 线段覆盖
- 【codevs 1214】线段覆盖
- Codevs 1214 线段覆盖
- CODEVS 1214线段覆盖
- codeVS 1214 线段覆盖
- codevs 1214 线段覆盖
- 线段覆盖 CODEVS
- Codevs 1214 线段覆盖
- codevs 线段覆盖系列
- hdu1754 I Hate It 线段树模板
- 五(1)、JSP的——Javabean
- 2018网易内推笔试-交错01串(python)
- 【leetcode】第32题 Longest Valid Parentheses 题目+解析+代码
- 图片Gaussian pyramid(二)
- 线段覆盖2 CODEVS
- [LintCode]82.落单的数
- C语言--内存操作与管理
- HDU 6152 Friend-Graph
- 每日英语阅读(三十五)
- Java 定义数组 学习笔记
- 逆元 【简单的知识点】
- POJ 3525/LA 3890 二分+半平面交
- 如何搭建本地服务器?