Codeforces 811C Vladik and Memorable Trip (区间异或最大值) (线性DP)
<题目链接>
题目大意:
给你n个数,现在让你选一些区间出来,对于每个区间中的每一种数,全部都只能出现在这个区间。 每个区间的价值为该区间不同的数的异或值之和,现在问你这n个数最大的价值是多少。
解题分析:
因为要同一种的所有数只能出现在同一区间,所以我们先对这$n$个数进行预处理,得到他们每种数的最左边的坐标和最右边的坐标。因为数据只有5000,所以状态可以比较暴力地更新,枚举最后一个异或的区间进行更新,用dp值来记录。
$dp[i]$表示$[1,i]$中异或值之和的最大值。第$i$个可以选或者不选,从这两种情况中选最大值。
不难想到,我们暴力枚举最后一个异或的区间,设区间左端点为$j$,区间端点为$i$。
转移方程就是:$dp[i]=max(dp[i],dp[j-1]+res)$ res表示$[j,i]$区间所有数的异或值
#include <bits/stdc++.h>
using namespace std; const int N = 5e3+;
int L[N],R[N];
int arr[N],dp[N],vis[N]; int main(){
int n;cin>>n;
for(int i=;i<=n;i++){
scanf("%d",&arr[i]);
if(!L[arr[i]])L[arr[i]]=i;
R[arr[i]]=i;
}
for(int i=;i<=n;i++){
dp[i]=dp[i-]; //首先默认不选这个数
memset(vis,,sizeof(vis));
int res=,le=1e9,ri=-;
for(int j=i;j>=;j--){ //枚举的区间左端点
le=min(le,L[arr[j]]);ri=max(ri,R[arr[j]]);
if(!vis[arr[j]])
res^=arr[j],vis[arr[j]]++;
if( ri>i || le<j )continue; //如果这个区间存在不符合要求的点,就不对该区间左端点的状态进行转移
dp[i]=max(dp[i],dp[j-]+res);
}
}
cout<<dp[n]<<endl;
}
Codeforces 811C Vladik and Memorable Trip (区间异或最大值) (线性DP)的更多相关文章
- CodeForces - 811C Vladik and Memorable Trip(dp)
C. Vladik and Memorable Trip time limit per test 2 seconds memory limit per test 256 megabytes input ...
- CodeForces 811C Vladik and Memorable Trip
$dp$. 记录$dp[i]$表示以位置$i$为结尾的最大值. 枚举最后一段是哪一段,假设为$[j,i]$,那么可以用$max(dp[1]...dp[j-1]) + val[j][i]$去更新$dp[ ...
- 【dp】codeforces C. Vladik and Memorable Trip
http://codeforces.com/contest/811/problem/C [题意] 给定一个自然数序列,在这个序列中找出几个不相交段,使得每个段的异或值之和相加最大. 段的异或值这样定义 ...
- cf 811c Vladik and Memorable Trip
原题链接:http://codeforces.com/contest/811/problem/C 题意:将数组中的连续数字连成若干个“线段”(或者不连),其实就是区间.区间必须满足对于其中的任意数字, ...
- Codeforces 811 C. Vladik and Memorable Trip
C. Vladik and Memorable Trip time limit per test 2 seconds memory limit per test 256 megabytes inp ...
- CodeForce-811C Vladik and Memorable Trip(动态规划)
Vladik and Memorable Trip CodeForces - 811C 有一个长度为 n 的数列,其中第 i 项为 ai. 现在需要你从这个数列中选出一些互不相交的区间,并且保证整个数 ...
- C. Vladik and Memorable Trip DP
C. Vladik and Memorable Trip time limit per test 2 seconds memory limit per test 256 megabytes input ...
- C. Vladik and Memorable Trip 解析(思維、DP)
Codeforce 811 C. Vladik and Memorable Trip 解析(思維.DP) 今天我們來看看CF811C 題目連結 題目 給你一個數列,一個區段的數列的值是區段內所有相異數 ...
- Codeforces Round #416 (Div. 2) C. Vladik and Memorable Trip
http://codeforces.com/contest/811/problem/C 题意: 给出一行序列,现在要选出一些区间来(不必全部选完),但是相同的数必须出现在同一个区间中,也就是说该数要么 ...
随机推荐
- docker-跨主机存储
容器分类 从业务数据的角度看,容器可以分为两类:无状态(stateless)容器和有状态(stateful)容器. 无状态是指容器在运行过程中不需要保存数据,每次访问的结果不依赖上一次访问,比如提供静 ...
- Linux-监控目录及文件
Linux-通过inotifywait监控目录及文件 inotifywait命令的使用此处就不写了:可以参考文章:https://www.cnblogs.com/martinzhang/p/41269 ...
- Springboot 3.需求携带参数的get请求
还是拿来上节讲的代码: package com.course.server; import org.springframework.web.bind.annotation.*; import java ...
- 关于ehcache缓存中eternal及timeToLiveSeconds和timeToIdleSeconds的说明
今天发现开发项目启动时有警告提示:cache 'xx' is set to eternal but also has TTL/TTI set,发现是ehcache缓存设置冲突 所以决定在此mark一下 ...
- pkuseg:一个多领域中文分词工具包
pkuseg简单易用,支持细分领域分词,有效提升了分词准确度. 目录 主要亮点 编译和安装 各类分词工具包的性能对比 使用方式 相关论文 作者 常见问题及解答 主要亮点 pkuseg具有如下几个特点: ...
- 【1】JDK8 HashMap扩容优化
JDK1.7 VS JDK1.8 比较 优化概述: resize 扩容优化 引入了红黑树,目的是避免单条链表过长而影响查询效率 解决了resize时多线程死循环问题,但仍是非线程安全的 这里主要讲讲扩 ...
- 如何清理Docker占用的磁盘空间?(转载)
本文转载自https://blog.fundebug.com/2018/01/10/how-to-clean-docker-disk/ , 感谢原作者. 摘要:用了Docker,好处挺多的,但是有一个 ...
- v-charts 和 websocket实现数据展示动态推送
v-charts https://v-charts.js.org/#/ ELEMENT力作: 在使用 echarts 生成图表时,经常需要做繁琐的数据类型转化.修改复杂的配置项,v-charts 的出 ...
- Notepad++ --v7.5.8 (64bit) 安装目录显示插件(Explorer)
https://blog.csdn.net/qq_24153697/article/details/83036761 最近想自己做一个小项目,用Notepad做IDE,但是发现已安装的Notepad没 ...
- Codeforces Round #447 (Div. 2) B. Ralph And His Magic Field 数学
题目链接 题意:给你三个数n,m,k;让你构造出一个nm的矩阵,矩阵元素只有两个值(1,-1),且满足每行每列的乘积为k,问你多少个矩阵. 解法:首先,如果n,m奇偶不同,且k=-1时,必然无解: 设 ...