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 题意: 给出一行序列,现在要选出一些区间来(不必全部选完),但是相同的数必须出现在同一个区间中,也就是说该数要么 ...
随机推荐
- Install Redmine on Virtual Machine with Vagrant
Initialize VM: chad@typcserver ~/docs/vagrant-prj $ vagrant --version Vagrant 1.4.3 chad@typcserver ...
- Java课程设计 ssm电影售票选座管理系统 电影网站的网页设计与制作mysql
注意:此项目只截图部分功能,可评论区咨询查看项目全部功能演示 1.开发环境 开发语言:Java 后台框架:SSM(Spring+SpringMVC+Mybatis) 前端技术:HTML+CSS+Jav ...
- CVE-2020-0796提权操作
简介 最新的windows10中使用了SMBv3协议,SMBv3协议在压缩消息时,未对头部数据做任何检查,导致恶意攻击者可以直接使用,从而导致内存破坏漏洞. 该漏洞可远程进行攻击目标系统,但目前只做到 ...
- 将JDK默认编码设置为UTF-8
此博文非原创:参考小兵qwer https://blog.csdn.net/xiaobing_122613/article/details/70209716 只是想留下对自己有用的东西,同时帮助更 ...
- NOIP 模拟 6 宝藏
题目 题解 这道题是 \(NOIP\;\;2017\) 的原题 ,让我见识到了什么是真正的 \(dfs\) 考场上想出来要状压了,\(n\) 那么小,肯定是压 \(n\) 那一位,然后层第转移,但是想 ...
- CSS3图片倒影技术
http://bbs.itheima.com/thread-330315-1-1.html?wymlxt
- 测试框架unit之assertion断言使用详解
NUnit是.Net平台的测试框架,广泛用于.Net平台的单元测试和回归测试中,下面我们用示例详细学习一下他的使用方法 任何xUnit工具都使用断言进行条件的判断,NUnit自然也不例外,与其它的xU ...
- 【设计模式】java设计模式目录
1.创建型模式 JDK1.5枚举Singleton 单例模式 AbstractFactory 工厂方法模式 简单工厂模式 Builder Prototype 2.结构型 java设计模式 ...
- spring生命周期的应用
1.ApplicationContextAware 实现手工加载bean: 例:https://www.cnblogs.com/wala-wo/p/5119192.html https://www.c ...
- 华为oj-判断输入的字符串是不是一个有效的IP地址
题目标题: 判断输入的字符串是不是一个有效的IP地址 详细描述: 请实现如下接口 boolisIPAddressValid(constchar* pszIPAddr) 输入:pszIPAddr 字符串 ...