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 题意: 给出一行序列,现在要选出一些区间来(不必全部选完),但是相同的数必须出现在同一个区间中,也就是说该数要么 ...
随机推荐
- Reuse Sonar Checkstyle Violation Report for Custom Data Analysis
Write a violation rules file; Import it into Sonar as a Quality Profile named as "MyRules" ...
- git命令行or图形化界面?看这篇操作就够了
我们在自己的私人分支开发好各自的模块后,就要合并到master,这个时候在idea里边先切换到master,然后update一下获取最新更新,解决一下冲突,最后再合并自己的私人分支,add,commi ...
- Elasticsearch IK分词器
Elasticsearch-IK分词器 一.简介 因为Elasticsearch中默认的标准分词器(analyze)对中文分词不是很友好,会将中文词语拆分成一个一个中文的汉字,所以引入中文分词器-IK ...
- KNeighborsClassifier()的参数无效错误
KNeighborsClassifier()的参数无效错误 写在前面:如果对自己英语拼写很自信,可以不用往下看了,我就是拼写错误 错误提示 Invalid parameter n_neightbors ...
- SpringBoot开发十二-账号设置
需求介绍-账号设置 账号设置里面的上传头像(文件) 首先请求必须是一个 POST 请求,其次表单的属性 enctype = "multipart/form-data" 然后就是利用 ...
- Spring系列之HikariCP连接池
上两篇文章,我们讲到了Spring中如何配置单数据源和多数据源,配置数据源的时候,连接池有很多选择,在SpringBoot 1.0中使用的是Tomcat的DataSource,在SpringBoot ...
- express中session的基本使用
1.首先安装express-session模块 npm install express-session --save 2.引入express-session,以及设置中间键 var session = ...
- 遇到的C++ cli 转 C++ native 为C# 程序提供接口。
接口文件 /*++ (do not edit the above line) ************************************************************* ...
- 信号量-Semaphore、SemaphoreSlim
核心类:Semaphore,通过int数值来控制线程个数. * 通过观察构造函数 public Semaphore(int initialCount, int maximumCount);: * in ...
- Java程序设计学习笔记(二)
--正则表达式 正则表达式 ^ 匹配的开始 $ 匹配的结束 [] 表示匹配任意一个字符 [asdasd] ...