题目描述
听说彩虹有七种颜色?
一维坐标轴上n条线段,每条线段左端点l,右端点r,颜色为c,从中选m种颜色的互不接触的线段,每种颜色可选多条,所选线段的总长度最长为多少?
输入描述:

第一行2个整数 n, m;
接下来n行,每行3个整数l, r, c。

输出描述:

一个整数,表示所选线段的最长的总长度;若选不了,输出-1;

示例1
输入
复制

4 2
1 3 1
4 5 1
5 8 2
7 9 3

输出
复制

5

示例2
输入
复制

4 3
1 3 1
4 5 1
5 8 2
7 9 3

输出
复制

-1

备注:

1 <= n <= 100000; 1 <= m <= 7;
1 <= l < r <= 1000000000; 1 <= c <= 7;

题意 : 在一维平面上给你 n 条线段,每条线段都有一个颜色,你可以在其中选出任意条线段,但任意两条均不能相交,且颜色数应恰好等于 m, 问你可以选取的最大长度是多少

思路分析 :观察发现颜色数 <= 7, 因此比较容易想到装压 dp,定义 dp[i][j] 表示到 i 条线段时,此时状态为 j 的最大长度

      显然根据这个可以去递推 dp[i][j|(1<<(arr[i].c-1))] = max(dp[i][j|(1<<(arr[i].c-1))], dp[pos][j]+arr[i].r-arr[i].l)

      最后再数一下状态中 1 的个数刚好等于 m 的即可

代码示例 :

#define ll long long
const ll maxn = 2e5+5; ll n, m;
struct node
{
ll l, r, c;
bool operator< (const node& v)const{
return r < v.r;
}
}arr[maxn];
vector<ll>ve;
ll dp[maxn][150];
ll bitnum[150]; void init(){
bitnum[0] = 0; for(ll i = 1; i <= 130; i++) bitnum[i] = 1+bitnum[i&(i-1)];
} void solve(){
memset(dp, -1, sizeof(dp));
dp[0][0] = 0;
ll ans = -1; for(ll i = 1; i <= n; i++){
for(ll j = 0; j < 128; j++){
dp[i][j] = max(dp[i-1][j], dp[i][j]);
ll pos = upper_bound(ve.begin(), ve.end(), arr[i].l-1)-ve.begin();
if(dp[pos][j] != -1) {
dp[i][j|(1<<(arr[i].c-1))] = max(dp[i][j|(1<<(arr[i].c-1))], dp[pos][j]+arr[i].r-arr[i].l);
}
if (bitnum[j] == m) ans = max(ans, dp[i][j]);
}
}
printf("%lld\n", ans);
} int main() {
init(); cin >> n >> m;
for(ll i = 1; i <= n; i++){
scanf("%lld%lld%lld", &arr[i].l, &arr[i].r, &arr[i].c);
}
sort(arr+1, arr+1+n);
for(ll i = 1; i <= n; i++) ve.push_back(arr[i].r);
solve(); return 0;
}

最新文章

  1. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
  2. word20161129
  3. GSON解析
  4. PowerMock.expectNew(Class&lt;T&gt; type, Class&lt;?&gt;[] parameterTypes, Object... arguments)
  5. js对象与this指向
  6. linux系统的文件和文件类型
  7. 题目1003:A+B ---c_str(),atoi()函数的使用;remove , erase函数的使用
  8. C# ADO.NET参数查询
  9. sql server identity限制
  10. android 数据存储之SharePreference 的几种方式
  11. 30第二建筑Github Page
  12. 常用业务接口界面化 in python flask
  13. Java虚拟机----垃圾回收与内存分配
  14. java mysql数据库链接与资源关闭
  15. Docker 容器中无ss命令解决方法
  16. PropertiesUtil
  17. spring+spring mvc+JdbcTemplate 入门小例子
  18. web前端----JavaScript的DOM(二)
  19. spring boot: freemarket模板引擎
  20. switch结构可以更好的解决等值判断问题

热门文章

  1. H3C OSPF协议区域LSA发布
  2. H3C 配置静态及动态域名解析
  3. C# 循环的判断会进来几次
  4. ZR提高失恋测2(9.7)
  5. [USACO10OCT]Lake Counting(DFS)
  6. 牛客wannafly 挑战赛14 B 前缀查询(trie树上dfs序+线段树)
  7. 【Linux】nl笔记
  8. Channel 9视频整理【2】
  9. Unitils集成DBUnit、Spring-单元测试(转)
  10. pytorch中DataLoader, DataSet, Sampler之间的关系