CodeForce-811C Vladik and Memorable Trip(动态规划)
Vladik and Memorable Trip
有一个长度为 n 的数列,其中第 i 项为 ai。
现在需要你从这个数列中选出一些互不相交的区间,并且保证整个数列中所有相同的数都在同一个区间中或都不在任意一个区间中。
要求最大化每个区间所有数去重后的异或和的总和。输出这个总和。
预处理出每个数字第一个出现的位置和最后一个出现的位置。以及每个区间内不同数字的异或和。
dp[i]表示考虑到前i个数,最大值是多少。分情况讨论一下即可。
#include <cstdio>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <string>
#include <cstring>
using namespace std;
#define _ ios::sync_with_stdio(false) const int MAXN = 5010;
const int INF = 0xfffffff;
typedef long long ll; int n;
ll a[MAXN];
int l[MAXN], r[MAXN];
ll s[MAXN][MAXN];
int vis[MAXN];
ll dp[MAXN];
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
scanf("%I64d", a + i);
if (l[a[i]])
l[a[i]] = min(l[a[i]], i);
else
l[a[i]] = i;
if (r[a[i]])
r[a[i]] = max(r[a[i]], i);
else
r[a[i]] = i;
}
for (int i = 1; i <= n; i++)
{
memset(vis, 0, sizeof(vis));
s[i][i] = a[i];
vis[a[i]] = 1;
for (int j = i + 1; j <= n; j++)
{
if (!vis[a[j]])
{
s[i][j] = s[i][j - 1] ^ a[j];
vis[a[j]] = 1;
}
else
{
s[i][j] = s[i][j - 1];
}
}
}
dp[0] = 0;
for (int i = 1; i <= n; i++)
{
int temp = a[i];
if (i == r[temp])
{
int L = l[temp];
int ok = 1;
for (int j = l[temp] + 1; j < r[temp]; j++)
{
if (r[a[j]] > i)
{
ok = 0;
break;
}
L = min(l[a[j]], L);
}
if (ok)
dp[i] = max(dp[i - 1], dp[L - 1] + s[L][i]);
else
dp[i] = dp[i - 1];
}
else
dp[i] = dp[i - 1];
}
printf("%I64d\n", dp[n]);
}
CodeForce-811C Vladik and Memorable Trip(动态规划)的更多相关文章
- 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)
<题目链接> 题目大意: 给你n个数,现在让你选一些区间出来,对于每个区间中的每一种数,全部都只能出现在这个区间. 每个区间的价值为该区间不同的数的异或值之和,现在问你这n个数最大的价值是 ...
- CodeForces 811C Vladik and Memorable Trip
$dp$. 记录$dp[i]$表示以位置$i$为结尾的最大值. 枚举最后一段是哪一段,假设为$[j,i]$,那么可以用$max(dp[1]...dp[j-1]) + val[j][i]$去更新$dp[ ...
- cf 811c Vladik and Memorable Trip
原题链接:http://codeforces.com/contest/811/problem/C 题意:将数组中的连续数字连成若干个“线段”(或者不连),其实就是区间.区间必须满足对于其中的任意数字, ...
- C. Vladik and Memorable Trip 解析(思維、DP)
Codeforce 811 C. Vladik and Memorable Trip 解析(思維.DP) 今天我們來看看CF811C 題目連結 題目 給你一個數列,一個區段的數列的值是區段內所有相異數 ...
- 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 ...
- C. Vladik and Memorable Trip DP
C. Vladik and Memorable Trip time limit per test 2 seconds memory limit per test 256 megabytes input ...
- 【动态规划】 Codeforces Round #416 (Div. 2) C. Vladik and Memorable Trip
划分那个序列,没必要完全覆盖原序列.对于划分出来的每个序列,对于某个值v,要么全都在该序列,要么全都不在该序列. 一个序列的价值是所有不同的值的异或和.整个的价值是所有划分出来的序列的价值之和. ...
- Codeforces Round #416 (Div. 2) C. Vladik and Memorable Trip
http://codeforces.com/contest/811/problem/C 题意: 给出一行序列,现在要选出一些区间来(不必全部选完),但是相同的数必须出现在同一个区间中,也就是说该数要么 ...
随机推荐
- kali 免杀工具shellter安装以及使用
Shellter 是一款动态 shellcode 注入工具,我们可以将shellcode注入到其它程序上,从而来躲避杀毒软件的查杀.俗称为免杀 官网:https://www.shellterproje ...
- NOIP 模拟 $29\; \rm 完全背包问题$
题解 \(by\;zj\varphi\) 一道 \(\rm dp\) 题. 现将所有种类从小到大排序,然后判断,若最小的已经大于了 \(\rm l\),那么直接就是一个裸的完全背包,因为选的总数量有限 ...
- ffmpeg第6篇:滤镜语法
前言 哈哈,回来继续填坑了,前段时间较忙没时间写,现在继续~ 简介 滤镜是ffmpeg的一个很强大的功能,它支持许多有用的视频处理功能,常见的滤镜如:缩放.旋转.水印.裁剪等 一个比较经典的滤镜使用方 ...
- TypeScript 入门指南 【大白话】
前言 聊聊为何要学习TypeScript? 从开发角度来讲, TypeScript 作为强类型语言,对属性有类型约束.在日常开发中少了减少了不必要的因参数类型造成的BUG,当你在使用同事封装好的函数时 ...
- 安全|常见的Web攻击手段之CSRF攻击
对于常规的Web攻击手段,如XSS.CRSF.SQL注入.(常规的不包括文件上传漏洞.DDoS攻击)等,防范措施相对来说比较容易,对症下药即可,比如XSS的防范需要转义掉输入的尖括号,防止CRSF攻击 ...
- promise对象调试
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 【GIS】点图层符号的方向和大小
方向:根据属性字段设置点图层中每个要素的符号方向和大小, 1 所有要素使用同一种符号---简单渲染 在图层属性---符号系统---单一符号中进行设置,首先设置符号,在后面的[高级]选项按钮中分别设置[ ...
- linux &和&&,|和||
&和&&,|和||区别: & 表示任务在后台执行,如要在后台运行redis-server,则有 redis-server & && 表示前一 ...
- BootStrap学习代码
要为毕设做准备了! 哎,毕设前台得自己来,所以打算学学bootstrap,把学习的代码放到码云上面了,使用HbuilderX来写,界面友好,适合我这种前端小白- 第一天就感受到了写html快捷键的强大 ...
- 在PyQt中构建 Python 菜单栏、菜单和工具栏
摘要:菜单.工具栏和状态栏是大多数GUI 应用程序的常见且重要的图形组件.您可以使用它们为您的用户提供一种快速访问应用程序选项和功能的方法. 本文分享自华为云社区<Python 和 PyQt:创 ...