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

Vladik and Memorable Trip

CodeForces - 811C

有一个长度为 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]);
}
时间: 2024-08-26 05:50:03

CodeForce-811C Vladik and Memorable Trip(动态规划)的相关文章

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

题目链接:Codeforces Round #416 (Div. 2) C. Vladik and Memorable Trip 题意: 给你n个数,现在让你选一些区间出来,对于每个区间中的每一种数,全部都要出现在这个区间. 每个区间的价值为该区间不同的数的异或值,现在问你这n个数最大的价值是多少. 题解: 比赛的时间直接就想到了做法,不过在选取合法区间的时候,细节上出了点小问题. 然后一直wa到怀疑人生.太菜了. 首先,先将合法的区间选取出来. 对于这些区间,按照左端点排序, 然后对于选出来的

【动态规划】 Codeforces Round #416 (Div. 2) C. Vladik and Memorable Trip

划分那个序列,没必要完全覆盖原序列.对于划分出来的每个序列,对于某个值v,要么全都在该序列,要么全都不在该序列. 一个序列的价值是所有不同的值的异或和.整个的价值是所有划分出来的序列的价值之和. 求整个的价值的最大值 f(i)表示最后一个划分序列的右端点为i时,1~i的答案. f(i)=max{max{f(j)}(1<=j<i)+xorsum(j+1,i)(j+1到i的区间合法)}(1<=i<=n) 需要在转移的时候,顺便处理f(i)的前缀max. 最终的答案就是所有f(i)的最大

Codeforces Round #416

(?_?)最近脑子不好使(虽然一直都不太好用...) A题换了三个思路,全wa了(ó﹏ò?),改了差不多15遍都有了(菜的醉死...) 最后让老大给我看看,哇,错了好多地方???????. 大佬给我改好了代码,我自己又开始改,我的小宇宙要爆发了,还好最后也改对了(菜的要撞墙了 |墙|????:)); CodeForces - 811A A. Vladik and Courtesy time limit per test 2 seconds memory limit per test 256 me

CF round416 div2 补题

A. Vladik and Courtesy 水题略过 #include<cstdio> #include<cstdlib> #include<cmath> using namespace std; typedef long long int LL; int main() { LL a,b; scanf("%I64d%I64d",&a,&b); LL num=1; while(true) { if(a<num){printf(&

poj 动态规划题目列表及总结

此文转载别人,希望自己能够做完这些题目! 1.POJ动态规划题目列表 容易:1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1208, 1276,1322, 1414, 1456, 1458, 1609, 1644, 1664, 1690, 1699, 1740(博弈),1742, 1887, 1926(马尔科夫矩阵,求平衡), 1936, 1952, 1953, 1958, 1959, 1962, 1975,

【DP专辑】ACM动态规划总结

转载请注明出处,谢谢.   http://blog.csdn.net/cc_again?viewmode=list          ----------  Accagain  2014年5月15日 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少,多元性强,主要考察思维能力.建模抽象能力.灵活度. 本人动态规划博客地址:http://blog.csdn.net/cc_again/article/category/1261899 ******************

(转)dp动态规划分类详解

dp动态规划分类详解 转自:http://blog.csdn.NET/cc_again/article/details/25866971 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少,多元性强,主要考察思维能力.建模抽象能力.灵活度. ****************************************************************************************** 动态规划(英语:Dynamic programm

hdu 3779 Railroad (动态规划)

Railroad Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 554    Accepted Submission(s): 223 Problem Description A train yard is a complex series of railroad tracks for storing, sorting, or load

动态规划——背包问题入门

动态规划--背包问题入门 1. 01背包 概述 给出N个物品,每个物体都具有一定的体积和价值,而每个物体都只有一个. 拥有一个V体积的背包,问应如何装包才能使背包中物体的总价值最大? 解题思路 背包问题是典型的动态规划类题目,而动态规划是典型的通过规律找出正解的方法.所以解题思路的关键在于如何寻找不同数据之间的关系(状态转移). 直接描述不方便解释,我们以例题为例: (注:01背包问题不涉及因为物体的形状.大小等而如何放入背包的问题,只是单纯考虑体积和价值.我们可以理解成每个物体都是液体,而这个