<题目链接>

题目大意:

给你n个数,现在让你选一些区间出来,对于每个区间中的每一种数,全部都只能出现在这个区间。 每个区间的价值为该区间不同的数的异或值之和,现在问你这n个数最大的价值是多少。

解题分析:
因为要同一种的所有数只能出现在同一区间,所以我们先对这$n$个数进行预处理,得到他们每种数的最左边的坐标和最右边的坐标。因为数据只有5000,所以状态可以比较暴力地更新,枚举最后一个异或的区间进行更新,用dp值来记录。

$dp[i]$表示$[1,i]$中异或值之和的最大值。第$i$个可以选或者不选,从这两种情况中选最大值。

不难想到,我们暴力枚举最后一个异或的区间,设区间左端点为$j$,区间端点为$i$。

转移方程就是:$dp[i]=max(dp[i],dp[j-1]+res)$    res表示$[j,i]$区间所有数的异或值

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int N = 5e3+;
  5. int L[N],R[N];
  6. int arr[N],dp[N],vis[N];
  7.  
  8. int main(){
  9. int n;cin>>n;
  10. for(int i=;i<=n;i++){
  11. scanf("%d",&arr[i]);
  12. if(!L[arr[i]])L[arr[i]]=i;
  13. R[arr[i]]=i;
  14. }
  15. for(int i=;i<=n;i++){
  16. dp[i]=dp[i-]; //首先默认不选这个数
  17. memset(vis,,sizeof(vis));
  18. int res=,le=1e9,ri=-;
  19. for(int j=i;j>=;j--){ //枚举的区间左端点
  20. le=min(le,L[arr[j]]);ri=max(ri,R[arr[j]]);
  21. if(!vis[arr[j]])
  22. res^=arr[j],vis[arr[j]]++;
  23. if( ri>i || le<j )continue; //如果这个区间存在不符合要求的点,就不对该区间左端点的状态进行转移
  24. dp[i]=max(dp[i],dp[j-]+res);
  25. }
  26. }
  27. cout<<dp[n]<<endl;
  28. }

Codeforces 811C Vladik and Memorable Trip (区间异或最大值) (线性DP)的更多相关文章

  1. 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 ...

  2. CodeForces 811C Vladik and Memorable Trip

    $dp$. 记录$dp[i]$表示以位置$i$为结尾的最大值. 枚举最后一段是哪一段,假设为$[j,i]$,那么可以用$max(dp[1]...dp[j-1]) + val[j][i]$去更新$dp[ ...

  3. 【dp】codeforces C. Vladik and Memorable Trip

    http://codeforces.com/contest/811/problem/C [题意] 给定一个自然数序列,在这个序列中找出几个不相交段,使得每个段的异或值之和相加最大. 段的异或值这样定义 ...

  4. cf 811c Vladik and Memorable Trip

    原题链接:http://codeforces.com/contest/811/problem/C 题意:将数组中的连续数字连成若干个“线段”(或者不连),其实就是区间.区间必须满足对于其中的任意数字, ...

  5. 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 ...

  6. CodeForce-811C Vladik and Memorable Trip(动态规划)

    Vladik and Memorable Trip CodeForces - 811C 有一个长度为 n 的数列,其中第 i 项为 ai. 现在需要你从这个数列中选出一些互不相交的区间,并且保证整个数 ...

  7. C. Vladik and Memorable Trip DP

    C. Vladik and Memorable Trip time limit per test 2 seconds memory limit per test 256 megabytes input ...

  8. C. Vladik and Memorable Trip 解析(思維、DP)

    Codeforce 811 C. Vladik and Memorable Trip 解析(思維.DP) 今天我們來看看CF811C 題目連結 題目 給你一個數列,一個區段的數列的值是區段內所有相異數 ...

  9. Codeforces Round #416 (Div. 2) C. Vladik and Memorable Trip

    http://codeforces.com/contest/811/problem/C 题意: 给出一行序列,现在要选出一些区间来(不必全部选完),但是相同的数必须出现在同一个区间中,也就是说该数要么 ...

随机推荐

  1. linux c编程之fcntl

    fcntl可实现对指定文件描述符的各种操作,其函数原型如下: int fcntl(int fd, int cmd, ... /* arg */ ); 其中,操作类型由cmd决定.cmd可取如下值: F ...

  2. python 学习地址

    本章主要记录学习python过程中借鉴的一些网站,并感谢这些博主辛勤付出. python官网:https://www.python.org/ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ...

  3. 第十节:基于MVC5+Unity+EF+Log4Net的基础结构搭建

    一. 前言 本节继续探讨一种新的框架搭建模式,框架的结构划分和上一节是相同的,本节IOC框架换成了Unity,并且采用构造函数注入的方式,另外服务层的封装模式也发生了变化,下面将详细的进行探讨. (一 ...

  4. 微信小程序 mpvue vant

    Mpvue中使用Vant Weapp组件库 https://segmentfault.com/a/1190000016228410?utm_source=tag-newest 小程序采坑记 mpvue ...

  5. [物理学与PDEs]第3章习题7 快、慢及Alfv\'en 特征速度的比较

    证明: 当 $H_1\neq 0$ 及 $H_2^2+H_3^2\neq 0$ 时, 快.慢及 Alfv\'en 特征速度 $C_f$, $C_s$ 及 $C_a$ 满足 $$\bex 0<C_ ...

  6. sql注入学习 sqlliab教程 lesson1 (sqlliab搭建教程)

    靶场搭建 小白建议直接用集成环境.推荐laragon (由于这套靶场较早,需要使用php7.0以下环境,安装完php laragon需要在安装php低版本,默认laragon只集成了一个7.0的php ...

  7. 运维工作笔记-------nginx的反向代理

    1.nginx的反向代理意义 一般来说,我们在项目中,不会直接让项目服务器ip与外网做直接映射,这样一则是不安全,二是客户直接去访问项目服务器,对项目服务器带来的压力太大,从而导致项目运行速度变慢,程 ...

  8. DUMP3.5 企业级电商项目

    购物车模块 加入商品 更新商品数 查询商品数 移除商品 单选/取消 全选/取消  购物车列表 [浮点型商业运算精度丢失问题]ej1st 一书提到 float double只适合科研计算,BigDeci ...

  9. git秘钥生成

    #修改git配置 vi .gitconfig #生成秘钥 ssh-keygen -t rsa -C "邮箱地址" #查看秘钥 cat id_rsa.pub

  10. python3 asyncio-协程模块测试代码

    import time import asyncio #统计运行时间的装饰器 def run_time(func): def wrapperfunc(*argv, **kwargv): now = l ...